Почему Gerrit не включает идентификатор изменения в транзакции слияния?

поэтому крюк git помещает только переменную Id в commit. Хотя комманды слияния могут быть перенаправлены на проверку ветки, даже Gerrit настроен на запрос Change-Id в сообщениях фиксации. И когда транзакция слияния была нажата, вся последующая фиксация будет зависеть от фиксации слияния - поскольку идентификатор изменения не существует. Итак, в чем цель не включать идентификатор изменения в объединение?

Ответы

Ответ 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 после закрытия редактора просто безопаснее.