【发布时间】:2011-07-25 20:52:12
【问题描述】:
我们项目中的一些贡献者喜欢直接在master上工作,但仍然忘记git pull --rebase。
有没有办法在服务器端拒绝像Merge branch 'master' of ... into master 这样的提交?
【问题讨论】:
-
有点类似,不是吗? stackoverflow.com/questions/2039773/…
我们项目中的一些贡献者喜欢直接在master上工作,但仍然忘记git pull --rebase。
有没有办法在服务器端拒绝像Merge branch 'master' of ... into master 这样的提交?
【问题讨论】:
作为VonC cmets,您可以使用我为该问题编写的pre-receive 挂钩的更简单版本来做到这一点。
为了重新表达您的要求,您希望在您的服务器上设置一个 pre-receive 钩子,该钩子将拒绝任何具有任何非线性历史的向 master 推送,即引入多个父级的任何提交。这个钩子应该做你想做的事:
#!/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's answer 中,他演示了使用git rev-list --merges 更简洁,所以我更新了这个脚本以使用它,并修复它循环遍历推送的每个引用正在尝试更新。
【讨论】:
/usr/bin/ruby - 你在那台机器上安装了 ruby,二进制文件所在的位置是?