删除git子模块 - 如何在pull上自动删除?

时间:2013-02-14 14:48:37

标签: git git-submodules

我看过how to remove a git submodule myself

# 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子目录的未跟踪目录,但是你有可能删除东西你想保持这种状态。

任何更好的选择。

1 个答案:

答案 0 :(得分: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
#http://stackoverflow.com/questions/1260748/how-do-i-remove-a-git-submodule#comment9411108_7646931
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