我如何在Git中编写预合并挂钩?

时间:2013-09-30 19:59:02

标签: git merge githooks

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

3 个答案:

答案 0 :(得分:19)

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

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

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

答案 1 :(得分:10)

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

引入了新的“ pre-merge-commi t”钩子。

请参见commit bc40ce4commit 6098817commit a1f3dd7Michael J Gruber (mjg)(2019年8月7日)。
请参见commit f78f6c7Josh Steadmon (steadmon)(2019年8月7日)。
(由Junio C Hamano -- gitster --commit f76bd8c中合并,2019年9月18日)

  

git-merge:荣誉pre-merge-commit

     

git-merge在执行自动合并时不遵守预提​​交挂钩   提交,并且出于兼容性原因,这种情况将保留。

     

引入一个pre-merge-commit挂钩,该挂钩被称为自动合并   就像pre-commit一样,commit会进行非自动合并提交   (或其他任何提交)。

documentation现在包括:

  

合并前提交

     

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

     

如果启用了默认的“ pre-merge-commit”钩子,则在启用后运行“ pre-commit”钩子。

     

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

     

如果无法自动执行合并,则需要解决冲突,并分别提交结果(请参见git-merge)。
  届时,该钩子将不会执行,但如果启用了'pre-commit钩子。

答案 2 :(得分:0)

另一个不错的解决方法是添加一个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会传递给真正的预合并钩子的任何参数,但你可以准备文件或任何你想准备合并的东西;我个人对这种方法非常满意:我花了2或3天的时间来寻找合并前的东西,然后我不得不使用pre-commit-msg,我找不到足够的准确性以满足我的需求。这解决了我所有的问题。希望这有助于将来的任何人。