我想做的事:
我想禁止将任何合并提交推送到中央存储库。唯一的例外是如果合并是在中央存储库中存在的分支之间。我想在中央存储库中强制执行此操作。
解释我为什么要这样做:
注意:如果这个解释让你偏离了我想要做的事情,那么忽略这个解释。当然,我很高兴听到解决我在下面解释的问题的其他方法,但我感兴趣的答案是我想要做的事情,如上所述。
我有一个中央 git 存储库,其中有几个开发人员跟踪的分支。每个开发人员都为该中央存储库的分支配置了一个远程。
我们对该项目遵循同步提交策略,因此每个开发人员必须始终在推送之前将他们的最新工作重新定位在远程分支 HEAD 之上。我想通过禁止将任何合并提交推送到中央存储库来执行此策略。唯一的例外是如果合并是在中央存储库中存在的分支之间。
为简化起见,我不希望开发人员的本地跟踪分支与远程分支合并。而是总是基于远程分支。
我们通过设置 branch.NAME.rebase = true 在开发人员的机器上部分强制执行此操作,这有助于避免开发人员使用 git pull 时出现问题,但是我们需要一个解决方案来在中央存储库端强制执行此操作。
一个非常基本的解决方案是拒绝带有注释的提交:“合并 GITURL 的分支 'NAME'”,但是,更多类似于检查中央存储库的分支路径中是否存在提交的所有父级的东西会更有趣。
建议?解决方案?
编辑:
这是我到目前为止所拥有的:
#!/bin/sh
read sha1old sha1new refname
# check if this is merge commit
merge_commit="`git rev-list --parents --merges --no-walk $sha1new 2> /dev/null`"
if test -n "$merge_commit"
then
# this was a merge commit
# $merge_commit contains: sha1new sha1parent_1 ... sha1parent_n
fi
exit 0
麻烦的地方是确定任何两个父母的祖先是否来自一个分支。另外,因为在更新任何参考之前调用了 pre-receive 钩子,如果推送包含远程中存在的两个分支的提交,包括这两个分支之间的合并,那么我不知道这里的解决方案是什么。 .