我们项目中的一些贡献者喜欢直接在 master 上工作,但仍然忘记了git pull --rebase
.
有没有办法在服务器端使用 commit like 拒绝提交Merge branch 'master' of ... into master
?
正如VonC评论的那样,您可以使用pre-receive
我为该问题编写的更简单版本的钩子来做到这一点。
换个说法,你想pre-receive
在你的服务器上有一个钩子,它会拒绝任何对具有任何非线性历史的主节点的推送,即引入任何具有多个父节点的提交。这个钩子应该做你想做的事:
#!/usr/bin/ruby -w
ref_to_check = "refs/heads/master"
STDIN.each_line do |line|
rev_old, rev_new, ref = line.split(" ")
if ref == ref_to_check
merges_introduced = `git rev-list --merges #{rev_old}..#{rev_new}`
unless merges_introduced.strip.empty?
STDERR.puts "Refusing push to #{ref}, since it would create non-linear"
STDERR.puts "history by introducing the following merge commits:"
STDERR.puts merges_introduced
exit(1)
end
end
end
更新:在Jefromi对链接问题的回答中,他演示了 usinggit rev-list --merges
更加简洁,所以我更新了这个脚本以使用它,并修复它以循环推送试图更新的每个 ref。