移除Git子模块但保留文件。

73

我有一个git子模块,希望将其纳入主项目中(因为我有许多项目特定的代码将进入子模块)。

因此,我想删除子模块中的git引用,并将文件添加到我的主git存储库中。

但是,如何操作?


仅需递归删除“.svn”文件夹。 - Raptor
这似乎是 https://dev59.com/23I-5IYBdhLWcg3wn526 的重复。 - Chad
3个回答

144

你必须从索引中删除git链接条目

mv subfolder subfolder_tmp
git submodule deinit subfolder
git rm --cached subfolder
mv subfolder_tmp subfolder
git add subfolder

用你的子模块文件夹名称替换 subfolder,确保不要添加任何斜杠。这是我在 "Remove a Git submodule?" 和 "un-submodule a git submodule" 中详细说明的。

--cached 选项允许您在磁盘上保留子文件夹内容...除了 git submodule deinit 会将该内容删除,所以需要执行 mv 步骤。

然后,您可以将该子文件夹添加并提交。


3
但是 git submodule deinit subfolder 会从磁盘中删除子文件夹的内容。由于内容已经不存在了,所以 --cached 选项不起作用。(git 1.9.2) - denis
1
@and-dev --cached 会从索引中删除,但不会从磁盘中删除。 - VonC
4
我发现deinit命令会将子文件夹还原为空目录。然后mv将临时子文件夹放入新的空目录中,而不是重命名它。因此,在进行最终的mv之前,请检查目录。否则,这个工作完成了。 - Jason
只需使用命令 "git rm --cached 子文件夹" 和 "git add ." 即可帮助您。 - Tony Wang
@TonyWang加什么?如评论所述,deinit命令将子文件夹还原为空目录。 - VonC
显示剩余2条评论

15

首先从子模块中删除 .git 文件夹。

只运行此命令会将缓存的文件夹和内容从git中移除,但不会删除该文件夹。

git rm -r --cached [EnterFolderNameWithoutBrackets]

3
应该被接受的答案。我还会删除.gitmodules并编辑.git/config以删除子模块的条目,尽管我不确定是否必要。 - Rafael Guimaraes Siqueira
为什么这个回答应该被接受,@RafaelGuimaraesSiqueira?为什么这比当前被接受的回答更好? - webejaxx

1

1
已更新被接受的答案以反映这些问题。 - Louth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接