如何在Git中编写合并前钩子?

waxmsbnn  于 2022-11-20  发布在  Git
关注(0)|答案(3)|浏览(249)

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

shstlldc

shstlldc1#

您可以尝试使用prepare-commit-msg挂钩。第二个参数将是merge“如果提交是合并或存在.git/MERGE_MSG文件”。非零退出状态将中止提交。
我不认为这将与快进合并一起工作,因为不会有提交消息。
有关挂钩的更多信息:https://www.kernel.org/pub/software/scm/git/docs/githooks.html#_prepare_commit_msg

eit6fx6z

eit6fx6z2#

在Git 2.24(Q4 2019)中,不需要脚本 Package 器或准备消息钩子。
引入了新的“pre-merge-commit”挂接。
参见Michael J Gruber ( mjg )commit bc40ce4commit 6098817commit a1f3dd7(2019年8月7日)。
参见Josh Steadmon ( steadmon )commit f78f6c7(2019年8月7日)。
(由Junio C Hamano -- gitster --合并至commit f76bd8c,2019年9月18日)

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

git-merge在执行自动合并提交时不荣誉pre-commit钩子,出于兼容性的原因,这将继续存在。
引入一个pre-merge-commit钩子,自动合并提交调用该钩子,就像非自动合并提交(或任何其他提交)调用预提交一样。
文档现在包括:

合并前提交

此挂接由git-merge调用。
它不带任何参数,在成功执行合并之后、获取建议的提交日志消息以进行提交之前调用。
以非零状态退出此脚本会导致git merge命令在创建提交 * 之前 * 中止。
默认的“pre-merge-commit "挂接在启用时运行”pre-commit“挂接(如果后者已启用)。
如果该命令不会打开编辑器来修改提交消息,则使用环境变量GIT_EDITOR=:调用此挂接。
如果无法自动执行合并,则需要解决冲突并单独提交结果(请参见git-merge)。
此时,将不会执行此挂接,但如果启用了“pre-commit”挂接,则会执行该挂接。
在Git 2.36(Q2 2022)中,run_commit_hook()的调用者会知道它之所以“成功”是因为钩子成功了还是因为没有钩子。
参见Ævar Arnfjörð Bjarmason ( avar )commit a8cc594commit 9f6e63b(2022年3月7日)。
(2022年3月16日由Junio C Hamano -- gitster --合并至commit 7431379
第1331章:不要在--no-verify上运行挂接后逻辑
签署人:埃瓦·阿恩菲约德·比贾马森
修复bc40ce4中引入的一个小错误(“merge--no-verify to bypass pre-merge-commit hook”,2019-08-07,Git v2.24.0-rc 0--batch #3中列出的merge),当该更改使--no-verify选项绕过pre-merge-commit hook时,它没有更新相应的find_hook()(后来的hook_exists())条件。
正如在前面的6098817中的提交(“git-merge:荣誉预合并提交钩子”,2019-08-07,Git v2.24.0-rc 0--mergebatch #3中列出)两者应该齐头并进。
如果钩子不可能更新索引,那么在这里调用discard_cache()是没有意义的。
我们在这里使用"hook_exist()“是有缺陷的,正如在随后的提交中所讨论的,它受到我们即将修复的模糊的争用条件的影响,但现在这个变化是一个严格的改进,保留了与"hooks_exist()“原样”使用有关的任何警告。
警告:评论中的Devin Rhode报告(2022年11月):
我想我实际上发现了一个错误,即pre-merge-commit钩子没有运行。
请参阅PR“Git的pre-merge-commit钩子不起作用(至少在core.hooksPath上)”

gr8qqesn

gr8qqesn3#

另一个很好的解决方法是添加一个shell脚本,按照您想要的方式调用它,然后将以下行添加到脚本中:

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

git "$@"

然后做一个

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

然后你就可以开始了。你刚刚添加了你自己的pre-merge钩子。我知道,你不能访问git传递给真实的的pre-merge钩子的任何参数,但是你可以准备文件或者任何你想准备合并的东西;我个人对这种方法非常满意:我花了2到3天的时间来寻找预合并的东西,然后我不得不去与预提交消息,我没有找到足够准确的我的需要。这解决了我所有的问题。希望这有助于任何人在未来。

相关问题