移除 Git 子模块 - 如何在拉取时自动移除?

4

我已经阅读了如何自己删除git子模块

# Delete the relevant section from the .gitmodules file.
git config -f .gitmodules --remove-section submodule.$submodulepath
# Delete the relevant section from .git/config
git config -f .git/config --remove-section submodule.$submodulepath
git rm --cached path_to_submodule    # no trailing slash
git commit
rm -rf path_to_submodule

我可以做到。但是当其他人执行git pull时,我们如何确保子模块从他们的系统中被移除?根据我所知,.gitmodules的更改会随着拉取而来,但似乎没有太多其他的变化。因此,拉取代码的人仍然需要运行以下命令:
git config -f .git/config --remove-section submodule.$submodulepath
rm -rf path_to_submodule

这样对吗?在一个小的开发团队中,你可能只需要告诉每个人运行这些命令,但这不是最理想的选择。

有没有某个神奇的命令可以自动化处理呢?特别是我希望在部署脚本中有一种标准的自动化方式。从我的记忆中,我不确定脚本怎么知道以前的子模块数目是否减少了。(不是特别吸引人的)选项包括:

  • 在拉取前后对.gitmodules进行比较
  • 删除所有子模块,然后在每个部署上运行git submodule update --init
  • 拉取后子模块变成了未跟踪的文件,所以一种可行的方法是在拉取后删除所有包含.git子目录的未跟踪目录,但这种方法会误删你想要保留的东西。

如果有更好的选项,请提出。


你执行的 git rm 命令不应该在拉取时删除子模型吗? - Daniel Hilgarth
@DanielHilgarth:最近我们执行时它没有被删除,但也许我没有按照上面的确切步骤操作。也许我应该测试一下。 - Hamish Downer
我没有测试过那个。我只是认为 git rm 对子模块的操作与对普通文件的操作相同。 - Daniel Hilgarth
git clean -df 对你来说是一个选项吗?它会删除所有未被跟踪的内容。 - CharlesB
@CharlesB:在开发环境中,通常会有一些我不想删除的未跟踪文件。我不能期望每个人都非常自律地将东西添加到.gitignore文件中,而且.gitignore文件可能变得非常混乱。如果没有其他可用的方法,我猜它可以用于部署到服务器上,而开发人员则必须手动删除子模块,但我更愿意找到一个清洁的解决方案。 - Hamish Downer
显示剩余2条评论
1个回答

1

在将代码部署到服务器上时,运行git clean(例如通过post-checkout钩子)以后进行拉取是一个安全的选择。

至于更新开发人员的仓库,在那里运行git clean是危险的,我不知道除手动修剪之外的其他方法。

但是以下(未经测试的)脚本将自动执行此操作,请将其命名为git prune-submodules。它依赖于一个事实,即在git pull之后,已删除的子模块仍列在.git/config中,因此您可以找出哪个子模块需要被存档。

我对shell脚本非常生疏,请务必仔细检查。

#!/bin/sh
#get the list of submodules specified in .git/config
#https://dev59.com/QHM_5IYBdhLWcg3wt1k0#2yUCoYgBc1ULPQZFcJII
submodules_cfg=`git config -f .git/config -l | cut -d'=' -f1 | grep "submodule.$MODPATH" | sed 's/^submodule\.//' | sed 's/\.url$//'`

#get the list of current submodules
submodules=`git submodule | cut -b 2- | cut -d' ' -f 2`

#archive submodule if listed in .git/config but doesn't exist anymore
for submodule_cfg in $submodules_cfg; do
    submodule_cfg_exists=0
    for submodule in $submodules; do
         if [ "$submodule" == "$submodule_cfg" ]; then
              submodule_cfg_exists=1
         fi
    done

    if ["$submodule_cfg_exists" == 0]; then
        mkdir -p archived-submodules
        mv $submodule_cfg archived-submodules/
        git config -f .git/config --remove-section submodule.$submodule_cfg
    fi
done

看起来不错 - 我还没有测试的机会,但如果需要任何编辑,我会回馈贡献。 - Hamish Downer

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