0

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

有没有办法在服务器端使用 commit like 拒绝提交Merge branch 'master' of ... into master

4

1 回答 1

1

正如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。

于 2011-03-30T09:00:04.577 回答