【问题标题】:GIT HOOK to check keyword "PROMOTE" in message when GIT MERGE is executedGIT HOOK 在执行 GIT MERGE 时检查消息中的关键字“PROMOTE”
【发布时间】:2015-08-26 00:50:05
【问题描述】:
每当与 master 和其他分支合并时,我需要检查消息中的“PROMOTE”关键字
例如:如果 git 命令是:
git merge -m "MERGE COMMIT 1 FROM BRANCH1 TO MASTER" f145cd536463e595f1e4306eeec6f92a9cd6c734
合并应该退出并出现错误“PROMOTE key word not set in merge message”
git merge -m "PROMOTE COMMIT 1 FROM BRANCH1 TO MASTER" f145cd536463e595f1e4306eeec6f92a9cd6c734
合并应该是成功的。
【问题讨论】:
标签:
git
github
git-merge
tortoisegit
【解决方案1】:
merge 命令的问题在于,除非您使用--no-ff,否则不能保证创建提交。例如,您可能会从命令中得到以下结果。
git merge -m "MERGE COMMIT 1 FROM BRANCH1 TO MASTER"
Updating f145cd5..cd6c734
Fast-forward (no commit created; -m option ignored)
查看post 和PDF,了解合并时快进与不快进的很好解释。有些人认为-no-ff 混淆了历史,它肯定会打破git-bisect 和git blame。然而,其他人喜欢--no-ff,因为它允许合并 cmets 和可视化功能分支中发生的事情。
如果您决定使用--no-ff,您可以将 git 配置为仅在全局或每个分支上执行 --no-ff。使用此命令仅在 master 上配置 --no-ff。
git config branch.master.mergeoptions "--no-ff"
让我们回到最初的问题。
Git 支持hooks,可用于验证和工作流。挂钩可以在开发人员推送更改的本地客户端或服务器上运行。使用客户端钩子commit-msg 的正则表达式,例如one,看起来很完美。但是 git 没有可用于拒绝合并的 pre-merge 钩子。请参阅here 获取挂钩列表及其触发命令。更糟糕的是,您会注意到 git merge 不会触发任何钩子,即使您使用 --no-ff 强制提交也是如此。
所以你有两个选择。它们与 post 中提到的相同,后者进一步探索了该主题,但没有更好的解决方案。
- 在开发人员推送的 git 服务器上放置一个更新挂钩,例如 one。这种方法的问题在于它并不能阻止他们制造糟糕的 cmets。这种方法只是使坏的 cmets 远离服务器。如果第一次没有正确执行,开发人员将不得不做大量工作来修复历史记录,然后才能推送到服务器。
- 编写(并分发和维护...)一个 git-merge 包装器,它将在本地 repo 级别进行控制。 Michael J Gruber 在他的 git fork here 中有一个 pre-merge hook。