我将如何在Git中编写一个合并前的钩子?

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

joshin4colours asked 2020-08-11T08:32:50Z
3个解决方案
21 votes

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

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

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

Kousha answered 2020-08-11T08:33:05Z
5 votes

使用Git 2.24(2019年第四季度)时,不需要脚本包装器或prepare-message挂钩。

引入了新的“ pre-merge-commit”挂钩。

请参阅Michael J Gruber(git-merge)的commit bc40ce4,commit 6098817和commit a1f3dd7(2019年8月7日)。
参见Josh Steadmon(git-merge)的commit f78f6c7(2019年8月7日)。
(由Junio C Hamano合并-git-merge-在commit f76bd8c中,2019年9月18日)

git-merge:荣誉pre-commit弯钩

git-merge执行自动合并时不遵守预提交挂钩 提交,并且出于兼容性方面的考虑,它将保留下来。

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

该文档现在包括:

合并前提交

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

如果启用了默认的“ pre-merge-commit”挂钩,则启用了“ pre-commit”挂钩。

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

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

VonC answered 2020-08-11T08:34:36Z
2 votes

另一个不错的解决方法是添加一个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,但我发现它不够准确,无法满足我的需求。 这解决了我所有的问题。 希望这对将来的任何人有帮助。

ElectRocnic answered 2020-08-11T08:35:07Z
translate from https://stackoverflow.com:/questions/19102714/how-would-i-write-a-pre-merge-hook-in-git