为所有用户关闭 git 分支上的快进

Turn off git fast forward on branch for all users

我有一个 git 存储库,其中有一个分支,我想为所有用户禁用快速合并。

我可以运行以下命令: git config branch.mybranch.mergeoptions "--no-ff" 但这只适用于我,不适用于任何其他开发人员。

有没有办法在提交到存储库的某个文件中设置该分支选项,以便它适用于所有开发人员?

没有完美的方法。您可以使用钩子(如下所述)将开发人员推向正确的方向;如果您希望开发人员会遵守 no-ff 政策,但只是想帮助他们避免犯错误,那应该没问题。但是,如果您需要真正严格的执行,那么您可能只需要使用访问控制来限制谁可以推送到分支。

一般来说,要执行有关分支移动方式的策略,您会使用挂钩。有关在 bitbucket 中使用钩子的信息可以在这里找到:https://confluence.atlassian.com/bitbucketserver/using-repository-hooks-776639836.html

所以可行的方法是,开发人员可以在本地进行快进;但是当他们试图将它推送到远程时,你会写一个钩子来识别并拒绝快进到那个分支。您让您的开发人员知道您正在这样做,然后任何明智的开发人员都会在本地应用 --no-ff 配置,这样他们就不会意外地进行本地提交,而他们不得不浪费时间来撤消。您甚至可以在更新本地配置的存储库中放置一个脚本,以简化操作。 (但是您不能强制要求它必须在本地 运行 - 这就是您依赖挂钩的原因。)

但是,在推送时,通常无法判断是否发生了快进合并[1]。你能做的最好的事情就是拒绝那些看起来可能发生快进的推送,并接受那些看起来可能没有发生快进的推送。

所以您可以寻找两件事。可能最 "bang for your buck" 是要求分支上的所有提交(仅遍历第一个父级)是合并提交。所以你的钩子可以 运行 类似于 git rev-list --first-parent --no-merges 的提交范围,从旧的 ref 到提议的更新的 ref。如果这产生任何输出,则推送被拒绝。

除了拒绝快进合并外,这还会拒绝直接提交给分支的提交。这可能是您想要的,但如果出现异常情况,处理起来可能会很麻烦。无论如何,直接提交到分支的提交通常与您通常从快进合并中获得的提交没有区别。

从技术上讲,有人仍然可以做这样的事情

x -- x -- o <--(target_branch)
          |\
          | ----- M <-(other_branch)
          \      /
           A -- B 

然后快进 target_branchother_branch 而不会触发挂钩。

您可以做的另一件事是,如果目标分支的第一个父提交将包括任何曾经被推送到远程不同分支的提交,则让钩子拒绝推送。就其本身而言,这不会阻止有人创建本地分支并在没有推送它的情况下快速转发到它。它可以与第一个 "merges only" 检查一起用作额外检查。但它只会捕捉到偶尔的边缘情况,而且编写起来会更复杂,运行 的成本也更高 - 所以它不太可能值得。


[1] 从远程的技术角度来看,分支在推送时移动的方式通常被认为是快进。它可能是快进到在本地回购中创建的合并,但对于远程本身来说仍然是 "looks like" 快进,除非在强制推送的情况下。