Ответ 1
Основная проблема в Git заключается в том, что commit-msg
hooks не вызываются для коммандов слияния без конфликтов.
Тем не менее, prepare-commit-msg
вызывается для (любого) слияния. Итак, то, что я сейчас делаю, чтобы Gerrit Change-Id
также добавил к слиянию коммитов без конфликтов, следует использовать prepare-commit-msg
hook следующим образом:
#!/bin/sh
if [ "$2" = "merge" -a -f .git/MERGE_MSG ]; then
# Explicitly call Gerrit commit-msg hook for merge commits.
.git/hooks/commit-msg "$1"
fi
Проверка .git/MERGE_MSG
гарантирует, что commit-msg
не будет вызываться, если исправление слияния происходит, потому что в этом случае этот крюк вызывается непосредственно Git. Обратите внимание, что для слияния с конфликтами этот подход приведет к тому, что commit-msg
будет вызываться дважды, один раз как часть этого крюка prepare-commit-msg
и один раз Git, когда он вызывает commit-msg
после принятия разрешения конфликтов, но это не вызывают любые проблемы, поскольку хук Gerrit commit-msg
проверяет, добавлен ли Change-Id
и не добавляет его снова, если это дело.
Если вы сейчас спрашиваете себя, почему Gerrit не просто использует только prepare-commit-msg
hook для добавления Change-Id
, я думаю, что просто для того, чтобы пользователь случайно удалил Change-Id
из сообщения фиксации. Добавление его как часть крюка commit-msg
после закрытия редактора просто безопаснее.