如何在Git中将文件添加到先前子模块的路径?


67

我有一个项目,该项目过去在path包含一个子模块mysubmodule。我从源代码(1.8.3-rc2)安装了最新的Git并运行了git submodule deinit mysubmodule。然后,我删除了.gitmodules文件并提交了更改。我还.gitmysubmodule文件夹中删除了目录。

我想立即将文件mysubmodule直接提交到我的仓库中,但是git表示没有任何更改。如果我键入git add mysubmodule它什么也不做。如果我键入git add mysubmodule/file.txt它说fatal: Path 'mysubmodule/file.txt' is in submodule 'mysubmodule'

我还发现,如果您签出回购的新版本mysubmodule,尽管没有.gitmodules文件,它也会创建一个目录。运行git submodule init会给您一个No submodule mapping found in .gitmodules for path 'mysubmodule'错误。

我该如何解决?


1
您是否检查了所有这些步骤,以确保子模块的任何部分都没有缠结?我不认为deinit完全删除了子模块。似乎只是从.git/config文件中将其删除,就好像您已使用子模块克隆了一个repo,但尚未运行git init。这与完全删除子模块不同。如果是这种情况,git仍然认为该文件夹是一个子模块,但忽略了它。
加里·弗克斯勒

Answers:


93

Git仍然认为这mysubmodule是一个子模块,因为它以特殊模式“ 160000”记录在索引中。
有关更多信息,请参见“仅最初需要git子模块更新? ”。
要检查,如在此答案中,您可以执行以下操作:

 $ git ls-tree HEAD mysubmodule 
 160000 commit c0f065504bb0e8cfa2b107e975bb9dc5a34b0398  mysubmodule 

这不取决于.gitmodule文件的存在或的内容mysubmodule

您需要先从索引中删除该条目:

 git rm --cached mysubmodule

然后,您可以继续。


git ls-tree HEAD mysubmodule没有给我任何结果,但是很git ls-files --stage | grep mysubmodule有效。参考。为什么会这样呢?
nzn

@nzn不确定:我刚刚测试了两者,并且它们都能工作。您在哪个操作系统上使用哪个git版本?
VonC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.