You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何自动暂存Git子模块中的提交记录?

Git子模块本地提交后自动同步到父项目的post-commit钩子方案

我最近在维护一个包含Git子模块的项目,子模块需要持续在本地构建迭代,每次在子模块里提交代码后,都得手动去父项目更新子模块的引用,时间长了实在有点繁琐。结合Git钩子、子模块操作以及环境调试的相关内容,我写了这个post-commit钩子,目前已经是可用的方案了,如果大家有更优的实现思路,欢迎一起交流改进~

钩子代码实现

#!/bin/sh
### functions
exec_push() {
 ping -c 1 heise.de 2>&1 >> /dev/null # 检查网络连通性
 PING_RESULT=$?
 if [ $PING_RESULT -eq "0" ]
 then
 git push --recurse-submodules=on-demand --quiet
 else
 echo "sorry no internet connectivity"
 exit 1
 fi
}
### end functions
echo "post-commit started"
branch="$(git rev-parse --abbrev-ref HEAD)"
echo "running on branch $branch"
superproject="$(git rev-parse --show-superproject-working-tree)"
echo "running for superproject $superproject"
current_submodule="$(pwd)"
echo "adding submodule $current_submodule"
if [ "$branch" = "master" ]
then
 exec_push
 env -i git -C "$superproject" add .
fi
echo "post-commit finished"

关键逻辑说明

  • 网络检查与推送:exec_push函数先通过ping命令确认网络连通性,确保能正常推送子模块的提交;如果没网就直接提示并退出,避免无效操作。推送时用--recurse-submodules=on-demand可以按需推送子模块的关联提交,--quiet减少冗余输出。
  • 分支限制:只在master分支提交时执行后续的推送和父项目更新操作,避免开发分支的提交触发不必要的同步。
  • 父项目暂存更新:用env -i git -C "$superproject" add .在父项目的上下文里暂存子模块的引用变更,这个操作不会直接提交父项目的变更,只是把变更加入暂存区,留到下次父项目做完整提交时一并处理,这样既保证了子模块引用的同步,又不会打断日常的提交流程。
  • 调试信息输出:钩子执行时会打印当前分支、父项目路径、子模块路径,方便出现问题时排查。

内容的提问来源于stack exchange,提问作者927589452

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:30:19