【问题标题】:How to avoid "Merge branch 'master' of ssh://gdcm.git.sourceforge.net/gitroot/gdcm/gdcm"如何避免“合并 ssh://gdcm.git.sourceforge.net/gitroot/gdcm/gdcm 的分支 'master'”
【发布时间】:2011-07-25 20:52:12
【问题描述】:

我们项目中的一些贡献者喜欢直接在master上工作,但仍然忘记git pull --rebase

有没有办法在服务器端拒绝像​​Merge branch 'master' of ... into master 这样的提交?

【问题讨论】:

标签: git shell server


【解决方案1】:

作为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 更简洁,所以我更新了这个脚本以使用它,并修复它循环遍历推送的每个引用正在尝试更新。

【讨论】:

  • 我有什么特别的吗?这是我得到的: 计数对象:13,完成。 Delta 压缩最多使用 4 个线程。压缩对象:100% (7/7),完成。写入对象:100% (7/7),668 字节,完成。共 7 个(增量 6),重用 0(增量 0)错误:无法运行 hooks/pre-receive:没有这样的文件或目录到 ssh://malat@gdcm.git.sourceforge.net/gitroot/gdcm/gdcm ! [远程拒绝] master -> master (pre-receive hook denied) 错误:未能将一些参考推送到 'ssh://malat@gdcm.git.sourceforge.net/gitroot/gdcm/gdcm'
  • “shebang”行指向/usr/bin/ruby - 你在那台机器上安装了 ruby​​,二进制文件所在的位置是?
  • (当然,您可以轻松地在 shell 脚本或任何其他脚本语言中做同样的事情。)
  • 我有红宝石。这是一个 sourceforge 限制。以下甚至对我不起作用:fedorahosted.org/fedora-infrastructure/attachment/ticket/1342/…
  • 本地机器上是否有 Ruby 显然无关紧要 - SourceForge 是否允许使用该语言的钩子。需要在 SourceForge 上设置这个钩子是很重要的一点,首先在问题中提到它会有所帮助:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多