私たちのプロジェクトの一部の貢献者は、 master で直接作業するのが好きで、まだ忘れていgit pull --rebase
ます。
のようなコミットでサーバー側のコミットを拒否する方法はあります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 の回答git rev-list --merges
で、彼は using の方がはるかに優れていることを示しているので、それを使用するようにこのスクリプトを更新し、プッシュが更新しようとしているすべての参照をループするように修正しました。