如何自动暂存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
相关产品推荐
相关产品推荐

