我看过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
子目录的未跟踪目录,但是你有可能删除东西你想保持这种状态。任何更好的选择。
答案 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