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

移除git子模块-如何在拉动时自动移除?,git,git-submodules,Git,Git Submodules,我读过: 我能做到。但是,当其他人执行git pull时,我们如何确保子模块随后从他们的系统中删除?.gitmodules的变化是伴随着拉动而来的,但就我所知,没有太多其他变化。所以拉车的人还得跑 git config -f .git/config --remove-section submodule.$submodulepath 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 clean
的服务器(例如通过
post checkout
钩子)是一个安全的选择

至于更新开发人员的repo,在那里运行
gitclean
是危险的,我只知道手工修剪

但是,下面的(未测试的)脚本将自动执行此操作,将其命名为类似于
git prune submodules
。它涉及到这样一个事实,即在
git pull
之后,删除的子模块仍然列在
.git/config
中,因此您可以找到要归档的子模块

我是shell脚本的新手,所以请仔细检查

#/垃圾箱/垃圾箱
#获取.git/config中指定的子模块列表
#http://stackoverflow.com/questions/1260748/how-do-i-remove-a-git-submodule#comment9411108_7646931
子模块\u cfg=`git config-f.git/config-l | cut-d'='-f1 | grep“子模块.$MODPATH“| sed's/^submodule\./'| sed's/\.url$/'`
#获取当前子模块的列表
子模=`git子模|截-b2-|截-d'-f2`
#如果在.git/config中列出但不再存在,则存档子模块
对于$submodules_cfg中的子模块_cfg;做
子模块\u cfg\u存在=0
对于$submodules中的子模块;做
如果[“$submodule”==“$submodule_cfg”];然后
子模块\u cfg\u存在=1
fi
完成
如果[“$submodule\u cfg\u存在”==0];然后
mkdir-p存档子模块
mv$子模块\U cfg存档子模块/
git config-f.git/config--删除节submodule.$submodule\u cfg
fi
完成

您执行的
git rm
命令不应该在拉拽时删除子模型吗?@DanielHilgarth:我们最近删除子模型时,它没有被删除,但可能我没有执行上面的确切步骤。也许我应该测试一下。@DanielHilgarth:刚刚检查过,
git rm
实际上并没有删除子模块文件,因此在第一组指令的末尾出现了
rm-rf路径。克隆副本还需要手动删除步骤。这对你来说不同吗?如果是的话,你使用的是什么版本的git?我没有测试过。我只是认为git-rm对子模块的作用和对普通文件的作用是一样的。@DanielHilgarth:我同意你的看法。但是git在命令行实用程序和参数的行为方面有一种与您的假设不匹配的方式…看起来不错-我还没有机会测试它,但是如果它需要任何编辑,我会把它们贡献回来。
git config -f .git/config --remove-section submodule.$submodulepath
rm -rf path_to_submodule