How do I add files in Git to the path of a former submodule?
我有一个项目曾经包含一个子模块,在路径mysubmodule处。我从源代码(1.8.3-rc2)安装了最新的git,并运行了git submodule deinit mysubmodule。然后,我删除了.gitmodules文件并提交了更改。我还从mysubmodule文件夹中删除了.git目录。
我现在想把mysubmodule的文件直接提交到我的repo中,但是git说没有任何更改。如果我输入git add mysubmodule,它什么也不起作用。如果我键入git add mysubmodule/file.txt,它表示fatal: Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'
我还发现,如果您查看repo的新版本,它会创建一个mysubmodule目录,尽管没有.gitmodules文件。运行git submodule init会给你一个No submodule mapping found in .gitmodules for path 'mysubmodule'错误。
我该怎么解决这个问题?
- 您是否检查了所有这些步骤以确保子模块的任何部分都不存在?我不认为deinit完全删除了子模块。它似乎只是从你的.git/config文件中删除它,就好像你用子模块克隆了一个repo,但还没有运行git init。这与完全删除子模块不同。如果是这样,Git仍然认为文件夹是一个子模块,但忽略了它。
Git仍然认为mysubmodule是一个子模块,因为它以一种特殊模式"160000"记录在索引中。参见"Git子模块最初只需要更新?"更多信息。要检查这一点,如此答案中所示,您可以执行以下操作:
1 2
| $ git ls-tree HEAD mysubmodule
160000 commit c0f065504bb0e8cfa2b107e975bb9dc5a34b0398 mysubmodule |
这不取决于.gitmodule文件的存在,也不取决于mysubmodule文件的内容。
您需要先从索引中删除该条目:
1
| git rm --cached mysubmodule |
号
然后你可以继续。
- git ls-tree HEAD mysubmodule没有给我任何结果,但git ls-files --stage | grep mysubmodule起作用了。参考。为什么会这样?
- @NZN不确定:我刚刚测试了两者,它们都能工作。您使用的是什么Git版本,在哪个操作系统上?