52

这个问题说明了一切。有没有办法在合并之前执行操作?我猜有一种方法可以使用pre-commit钩子,但我不太确定。

4

3 回答 3

27

您可以尝试使用prepare-commit-msg钩子。第二个参数将是merge“如果提交是合并或.git/MERGE_MSG文件存在”。非零退出状态将中止提交。

我认为这不适用于快进合并,因为不会有提交消息。

有关钩子的更多信息:https ://www.kernel.org/pub/software/scm/git/docs/githooks.html#_prepare_commit_msg

于 2013-10-18T23:01:46.370 回答
20

使用 Git 2.24(2019 年第四季度),无需脚本包装器或准备消息挂钩。

引入了一个新的“ pre-merge-commit ”钩子。

请参阅Michael J Gruber ( )的commit bc40ce4commit 6098817commit a1f3dd7(2019 年 8 月 7 日) 。 请参阅Josh Steadmon ( ) 的提交 f78f6c7(2019 年 8 月 7 日(由Junio C Hamano 合并——提交 f76bd8c中,2019 年 9 月 18 日)mjg
steadmon
gitster

git-merge: 荣誉pre-merge-commit挂钩

git-merge在进行自动合并提交时不遵守预提​​交钩子,出于兼容性原因,这将保留。

引入一个pre-merge-commit为自动合并提交调用的钩子,就像为非自动合并提交(或任何其他提交)调用预提交一样。

文档现在包括:

合并前提交

此挂钩由 调用git-merge
它不带任何参数,并在成功执行合并后且在获取建议的提交日志消息以进行提交之前调用。
从此脚本中以非零状态退出会导致git merge命令在创建提交之前中止。

默认的“pre-merge-commit”钩子在启用时运行“pre-commit”钩子,如果后者被启用的话。

GIT_EDITOR=:如果命令不会调出编辑器来修改提交消息,则使用环境变量调用此挂钩。

如果无法自动执行合并,则需要解决冲突并单独提交结果(请参阅 参考资料git-merge)。
此时,不会执行此钩子,但pre-commit如果启用了 ' ' 钩子,它将执行。

于 2019-09-18T21:44:40.070 回答
2

另一个不错的解决方法是添加一个 shell 脚本,像你想要的那样调用它,然后将这些行添加到脚本中:

git() {
    if [ "$1" == "merge" ]; then
        echo "seems to work like a charme"
    fi
    command git "$@"
}

git "$@"

然后做一个

alias git="./my-pre-merge-script.sh"

那你就可以走了。您刚刚添加了自己的预合并钩子。我知道,您无权访问 git 将传递给真正的 pre-merge 钩子的任何参数,但您现在可以准备文件或任何您想为合并做准备的东西;我个人对这种方法非常满意:我花了 2 到 3 天的时间来寻找预合并的东西,然后我不得不使用 pre-commit-msg,但我发现它对我的需求不够准确。这解决了我所有的问题。希望这对将来的任何人都有帮助。

于 2018-02-06T20:27:57.667 回答