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

6tqwzwtp  于 2023-02-11  发布在  Git
关注(0)|答案(4)|浏览(134)

以下是如何"本地"删除子模块的有用答案-How do I remove a submodule?
但是我有一个问题,我在几台机器上克隆了我的repo。其中两台我一个月只工作一到两次。所以当我更新那些分支时,尽管子模块不再被跟踪,但文件仍然在.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

在parent中,目录javascript-tetris消失,.gitmodules中的条目被删除,但仍有一个填充的.git/modules/javascript-tetris目录。
在克隆端:

git pull

给出警告:warning: unable to rmdir 'javascript-tetris': Directory not empty。目录仍然存在,.git/modules/javascript-tetris也仍然存在。

xoshrz7s

xoshrz7s1#

这对你有帮助吗?

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/子模块路径(不带斜杠)。
  • 提交git commit -m“已删除的子模块“
  • 删除现在未跟踪的子模块文件rm -rf path_to_submodule

Source

1rhkuytd

1rhkuytd2#

有点像在this gist中,您可以使用git clean在这些计算机上启动工作会话:

git clean -xfdf

如果您想先进行预演,可以使用-n标志:

git clean -n -xfdf

使用两次强制清除包含.git子目录的目录:git clean -xfdf.
我有一些纠结的子模块,不会得到删除只是git clean -xfd

7uzetpgm

7uzetpgm3#

git rm应该处理所有的脏工作,但它没有。
文档指出您需要手动清理.git/modules目录,目前为止我找到的最佳选择是基于VonC的回答,使用sedxargs对输出进行后处理:

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

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

slmsl1lt

slmsl1lt4#

不幸的是,一个直接的命令来完全删除Git子模块似乎并不存在。
请参见以下Git Submodules Documentation摘录:
删除的子模块:子模块可以通过运行git rm && git commit来删除,也可以通过git revert来撤销。
删除操作会移除超级项目的跟踪数据,包括gitlink条目和.gitmodules文件中的section。子模块的工作目录会从文件系统中移除,但Git目录会保留下来,这样就可以 checkout 过去的提交,而不需要从另一个仓库中提取。
要完全删除子模块,请手动删除$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中得到一些灵感。

相关问题