How to avoid “Merge branch 'master' of ssh://gdcm.git.sourceforge.net/gitroot/gdcm/gdcm”

匿名 (未验证) 提交于 2019-12-03 01:36:02

问题:

Some contributors in our project likes to work on master directly and still forget to git pull --rebase.

Is there a way to refuse on the server side commit with commit like Merge branch 'master' of ... into master ?

回答1:

As VonC comments, you can do this with a simpler version of the pre-receive hook that I wrote for that question.

To rephrase what you're asking, you would like a pre-receive hook on your server that will refuse any push to master which has any non-linear history, i.e. introduces any commit with more than one parent. This hook should do what you want:

#!/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 

Update: in Jefromi's answer to the linked question, he demonstrates that using git rev-list --merges is much neater, so I've updated this script to use that, and fixed it to loop over every ref that the push is trying to update.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!