git merge使用--no-commit选项时不会触发pre-merge-commit或post-merge挂钩。

3

我目前正在添加一些自动化功能,在用户拉取或合并到当前分支之后执行(例如更新用户设置,构建更新的依赖项)。我阅读了钩子文档,并发现 pre-merge-commit / post-merge 钩子可以为我完成这项任务。因此,在我们没有合并冲突的情况下,即合并成功的情况下,这两个钩子都应该触发。

只要合并不对工作副本进行更改(作为合并结果),这种方法就可以正常工作。但是,如果有更改(例如添加了新文件),并且我使用 git merge 命令运行 --no-commit 选项,则 pre-merge-commit 和 post-merge 钩子都不会被执行。

至少对于 pre-merge-commit 钩子,我希望在提交之前触发钩子!

这是设计如此吗?是否有另一种方法可以在合并成功后触发脚本,而无需提交?

谢谢!


“No commit” 就是这个意思。无论是预提交钩子还是预合并钩子,都会在提交之前作为提交的一部分发生,因此不应该在此处发生。如果您选择提交结果,则应稍后运行钩子。 - torek
是的,我知道。问题在于钩子没有被执行。默认合并启用了提交选项,在这种情况下,两个钩子都会被执行。但是当我只想合并而不进行完成提交时,即--no-commit,pre-merge-hook就不会被执行。但据我所知,它应该在成功合并后但提交之前运行。而post-merge hook根本没有被执行。希望我已经更清楚地说明了问题。 - Sven
1
预合并提交钩子应该在运行git merge --continue以完成合并时运行。理想情况下,当您使用git commit完成合并时,它甚至也应该运行。如果它对于任何一种情况都不运行,那似乎是一个明显的错误;如果它对于git merge --continue运行但对于提交合并的git commit不运行,那似乎也是一个错误,但可能更有争议。 - torek
1个回答

2
我同意您的观点,文档并没有很清楚地说明何时执行该操作,但我认为至少提交过程必须开始。原因如下:

pre-merge-commit(在成功合并后,在获取建议的提交日志消息之前进行提交)

第一部分很清楚,必须成功合并。第二部分可能会被误解,但我这样理解:
  1. 收到提交请求
  2. 运行pre-merge-commit
  3. 提示提交消息
  4. ...
毕竟,该钩子在其默认实现中运行pre-commit钩子,后者又被git commit调用。特别是最后这部分让我认为这不是一个错误或任何类似的问题,而是一个设计选择。

git commit的角度讲述故事可以解释为什么钩子首先没有被执行。我从未想过Git会有bug,因为它非常成熟,其他人之前一定遇到过这个问题。有趣的是,当您处于手动提交模式时,钩子也不会被执行。因此,它必须是一个无阻的集成工作流程。 - Sven
我认为有一些使用情况需要将合并提交和单独的合并分开。你们中有人有什么想法,我该如何模拟这种行为,例如使用另一个钩子? - Sven
你可能想要保持这两个进程分开,但是git团队没有为此提供任何明确的钩子。大多数情况下并不需要,他们可能已经决定不为这种特定情况创建钩子(我实际上不知道,这只是我的猜测)。为什么不能提交? - Marco Luzzara
1
通常情况下,我想提交并执行钩子。但在某些情况下,如果合并失败,我仍然希望执行一些清理/其他脚本,因为它们在解决合并冲突后的最终提交中不会被执行。如果发生这种情况,我对钩子完全满意。但是一旦由于合并冲突而取消了流程,就无法恢复。 - Sven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接