19

所以 git 钩子只会将更改 ID 放入提交中。尽管可以将合并提交推送到审查分支,即使 Gerrit 被配置为在提交消息中需要 Change-Id。并且当合并提交已被推送时,所有后续提交将取决于合并提交 - 因为没有更改 Id。那么不将更改 Id 包含到合并提交中的目的是什么?

4

1 回答 1

22

Git 的根本问题是commit-msg没有冲突的合并提交不会调用钩子。

但是,prepare-commit-msg需要(任何)合并提交。因此,我目前要让 GerritChange-Id也添加到合并提交中而不会发生冲突的方法是使用这样的prepare-commit-msg钩子:

#!/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

检查.git/MERGE_MSG确保commit-msg不会在修改合并提交时调用,因为在这种情况下,无论如何 Git 都会直接调用该钩子。请注意,对于冲突的合并提交,此方法将导致commit-msg被调用两次,一次作为此prepare-commit-msg钩子的一部分,一次由 Gitcommit-msg在提交冲突解决后调用时调用,但这不会导致任何问题,因为 Gerrit 的commit-msg钩子会检查是否Change-Id已经已添加,如果是这种情况,则不再添加。

如果你现在问自己为什么 Gerrit 不简单地使用prepare-commit-msg钩子来添加Change-Id,我想这只是为了防止用户不小心Change-Id从提交消息中删除 。commit-msg在编辑器关闭后将其作为钩子的一部分添加更安全。

于 2014-07-11T07:59:29.800 回答