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

问题描述 投票:16回答:4

有一些有用的答案如何“本地”删除子模块 - How do I remove a submodule?

但是我有问题我在几台机器上克隆了我的仓库。两个我每个月只工作一到两次。因此,当我更新那些分支时虽然不再跟踪子模块,但文件仍然在.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 git-submodules
4个回答
3
投票

有点像在this gist,你可以在那些带有git clean的机器上开始你的工作会话:

git clean -xfdf

使用force两次使用.git子目录清理目录:git clean -xfdf。 我有一些纠结的子模块不会被git clean -xfd删除。


3
投票

git rm应该处理所有肮脏的工作,但事实并非如此。

文档表明您需要手动清理.git/modules目录。到目前为止,我发现的最佳选择是通过使用sedxargs对输出进行后处理来建立VonC的答案:

git clean -xfdf | sed 's/Removing /\.git\/modules\//' |xargs rm -rf

我不太喜欢这个选项,因为它非常脆弱,并且依赖于清理尚未执行。您可能最好在验证克隆中没有本地提交并在其他工作站上从头开始重新克隆。


2
投票

不幸的是,完全删除Git子模块的直接单一命令似乎不存在。

请参阅以下Git Submodules Documentation的摘录:

删除子模块:可以通过运行git rm && git commit删除子模块。这可以使用git revert撤消。

删除删除了超级项目的跟踪数据,它们都是gitlink条目和.gitmodules文件中的部分。子模块的工作目录从文件系统中删除,但Git目录保留在其中,以便可以在不需要从另一个存储库获取的情况下检出过去的提交。

要完全删除子模块,请手动删除$ GIT_DIR / modules / {name} /。

但是,您可以轻松创建自己的git命令来执行此answer中讨论的任务。

例如,您可以使用以下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 Files\Git\cmd)并将其命名为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 activity command获得一些灵感。


2
投票

这对你有帮助吗?

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

UPDATE

要删除子模块,您需要:

  • 从.gitmodules文件中删除相关部分。
  • 阶段.gitmodules更改git add .gitmodules
  • 从.git / config中删除相关部分。
  • 运行git rm --cached path_to_submodule(没有尾部斜杠)。
  • 运行rm -rf .git / modules / path_to_submodule(无尾部斜杠)。
  • 提交git commit -m“删除子模块”
  • 删除现在未跟踪的子模块文件rm -rf path_to_submodule Source
© www.soinside.com 2019 - 2024. All rights reserved.