清理克隆上的 git 子模块的工作流程是什么?



有有用的答案如何"本地"删除子模块 - 如何删除子模块?

但是我遇到了一个问题,我在几台机器上克隆了我的存储库。两个我每个月只工作一两次。 因此,当我更新那些分支时,尽管不再跟踪子模块,但文件仍然在工作分支上,.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 的答案之上,通过使用sedxargs对输出进行后处理:

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 活动命令中获得一些灵感。

最新更新