有有用的答案如何"本地"删除子模块 - 如何删除子模块?
但是我遇到了一个问题,我在几台机器上克隆了我的存储库。两个我每个月只工作一两次。 因此,当我更新那些分支时,尽管不再跟踪子模块,但文件仍然在工作分支上,.git/modules
. 我不止一次不小心检查了一些。 在其他情况下,由于存在这些不需要的文件/目录,我的构建失败了。
我想我可以保留要删除的内容列表 - 但这似乎不对 - 另一个人会删除并且我在 git 之外没有要删除的信息怎么样?
那么清理克隆的建议方法是什么?
更新
对我来说,git --version
返回git version 2.18.0
似乎是最新的(它是 2018-09-01(。
我添加了一个可重现的示例。
设置
mkdir parent
cd parent
git init
git submodule add https://github.com/jakesgordon/javascript-tetris.git
git commit -am add
cd ..
git clone parent clone
cd clone
git submodule update --init
现在,两个目录都包含子模块,并在javascript-tetris/
中签出文件。.gitmodules
包含子模块。
当我这样做时
cd parent
git rm javascript-tetris
git commit -am delete
在父目录中,目录javascript-tetris
消失,.gitmodules
删除中的条目。 但仍有一个填充的.git/modules/javascript-tetris
目录。
在克隆端:
git pull
给出警告:warning: unable to rmdir 'javascript-tetris': Directory not empty
。 目录仍然存在,.git/modules/javascript-tetris
仍然存在。
这对你有帮助吗?
git clean -xfd
git submodule foreach --recursive git clean -xfd
git reset --hard
git submodule foreach --recursive git reset --hard
git submodule update --init --recursive
更新
要删除子模块,您需要:
- 从 .gitmodules 文件中删除相关部分。
- 暂存 .gitmodules 更改 git 添加 .gitmodules
- 从 .git/config 中删除相关部分。
- 运行 git rm --cached path_to_submodule(无尾部斜杠(。
- 运行 rm -rf .git/modules/path_to_submodule(无尾部斜杠(。
- 提交 git commit -m "已删除的子模块">
删除现在未跟踪的子模块文件 rm -rf path_to_submodule
源
有点像这个要点,你可以用 git clean 在这些机器上开始你的工作会话:
git clean -xfdf
如果要先进行试运行,可以使用-n
标志:
git clean -n -xfdf
使用两次强制清理包含
.git
子目录的目录:git clean -xfdf
.
我有一些纠结的子模块,仅git clean -xfd
就不会被删除。
git rm
应该处理所有肮脏的工作,但没有。
文档指示您需要手动清理.git/modules
目录。到目前为止,我找到的最佳选择建立在 VonC 的答案之上,通过使用sed
和xargs
对输出进行后处理:
git clean -xfdf | sed 's/Removing /.git/modules//' |xargs rm -rf
我不太喜欢这个选项,因为它非常脆弱,并且取决于尚未执行的清理。您最好验证克隆中没有本地提交,并在其他工作站上从头开始重新克隆。
不幸的是,完全删除 Git 子模块的直接命令似乎不存在。
请参阅下面的 Git 子模块文档摘录:
删除的子模块:可以通过运行 git rm 删除子模块 &&git commit。这可以使用 git 还原撤消。
删除操作会删除超级项目的跟踪数据,这些数据都是 gitlink 条目和 .gitmodules 文件中的部分。这 子模块的工作目录已从文件系统中删除,但 Git 目录被保留在周围,因为它可以结帐 过去的提交,不需要从另一个存储库获取。
要完全删除子模块,请手动删除 $GIT_DIR/modules/{name}/.
但是,您可以轻松创建自己的 git 命令来执行本答案中讨论的此类任务。
例如,您可以使用以下 bash 脚本创建一个文件:
#!/bin/bash
echo "Running git rm ${1}"
git rm $1
echo "Running rm -rf .git/submodules/${1}"
rm -rf .git/modules/$1
exit 0
然后,您必须将其放在PATH中可见的目录中(例如,在我的情况下,它可以是C:Program FilesGitcmd
(并将其命名为git-{my_command_name}
(例如,git-rm-module
(。
这样,您可以像git rm-module {my-submodule-name}
一样使用它。 结果将是:
$ git rm-module my-submodule-name
Running git rm-submodule my-submodule-name
Running rm -rf .git/submodules/my-submodule-name
对于复杂的选项,您可以从此 git 活动命令中获得一些灵感。