The underlying problem in Git is that commit-msg
hooks are not called for merge commits without conflicts.
However, the prepare-commit-msg
is called for (any) merge commits. So what I currently do to get Gerrit's Change-Id
also added to merge commits without conflicts is to use a prepare-commit-msg
hook like this:
#!/bin/sh
if [ "$2" = "merge" -a -f .git/MERGE_MSG ]; then
# Explicitly call Gerrit's commit-msg hook for merge commits.
.git/hooks/commit-msg "$1"
fi
The check for .git/MERGE_MSG
ensures that commit-msg
will not be called if amending a merge commit, because in that case that hook is called directly by Git anyway. Note that for merge commits with conflicts this approach will result in commit-msg
being called twice, once as part of this prepare-commit-msg
hook and once by Git when it calls commit-msg
after committing the conflicts resolution, but that does not cause any problems as Gerrit's commit-msg
hook checks whether the Change-Id
has already been added and does not add it again if that's the case.
If you're now asking your self why Gerrit does not simply use only a prepare-commit-msg
hook to add the Change-Id
, I guess that just to prevent the user from accidentally deleting the Change-Id
from the commit message. Adding it as part of a commit-msg
hook after the editor has closed is just safer.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…