我的工作项目如下:
project/
.git/
.gitmodules
submodule/ # submodule is a git submodule
我希望每当我在子模块中进行提交时。父模块project
将submodule
使用相同的提交消息进行提交。我试图使用commit-msg
钩子来实现这一点:
#!/bin/bash
# project/.git/modules/submodule/hooks/commit-msg
cd $(dirname ${BASH_SOURCE[0]})/../../../..
git commit submodule -m "$(cat $1)"
但这不起作用,因为我收到错误消息“错误:pathspec'子模块'与git已知的任何文件都不匹配”。原因似乎是因为该git commit
命令还将调用该commit-msg
钩子,从而导致递归调用。
我可以知道如何正确执行此操作吗?
commit-msg
可能不是执行此操作的最佳位置,因为它用于处理提交消息,并且在调用子模块时尚未进行提交。
这个post-commit
挂钩对我有用:
COMMIT_MSG=$(git log -1 --pretty='format:%B' HEAD)
# I use zsh so $0 works for me. In bash BASH_SOURCE is correct
TOP=$(realpath $(dirname $0)/../../../..)
GIT_INDEX_FILE_SAV=$GIT_INDEX_FILE
unset GIT_INDEX_FILE
git --git-dir .git --work-tree . -C ${TOP} commit sub -m "${COMMIT_MSG}"
GIT_INDEX_FILE=$GIT_INDEX_FILE_SAV
调用该钩子时,我们位于git commit
子模块的中间,因此GIT*
根据子模块存储库设置了各种环境变量。我们需要重置它们,并让git使用父仓库中的值。
[编辑]更好的填充方法$TOP
是
TOP=$(git rev-parse --show-superproject-working-tree)
感谢@phd提出建议。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句