Как комментарии VonC , вы можете сделать это с помощью более простой версии pre-receive
ловушки, которую я написал для этого вопроса.
Чтобы перефразировать то, что вы спрашиваете, вы хотели бы подключить pre-receive
на своем сервере, который будет отклонять любой push to 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
Обновление: в Ответ Джефроми на связанный вопрос, он демонстрирует, что использование git rev-list --merges
намного удобнее, поэтому я обновил этот скрипт, чтобы использовать его, и исправил его зацикливание каждый реф, который пытается обновить пуш.