2011-03-30 3 views
0

우리 프로젝트의 일부 기고자는 직접 마스터 작업을 좋아하지만 여전히 git pull --rebase을 잊어 버립니다."merge branch 'master of ssh : //gdcm.git.sourceforge.net/gitroot/gdcm/gdcm"

Merge branch 'master' of ... into master 같은 커밋으로 서버 쪽 커밋을 거부 할 수있는 방법이 있습니까?

+0

조금 비슷합니까? http://stackoverflow.com/questions/2039773/have-remote-git-repository-refuse-merge-commits-on-push – VonC

답변

1

VonC 개의 댓글을 사용하면이 질문에 대해 작성한 pre-receive 후크의 간단한 버전으로이 작업을 수행 할 수 있습니다.

당신이 물어보고 싶은 말을 바꾸려면 서버에 pre-receive 후크를 사용하여 비선형 히스토리가있는 밀어 넣기를 거부합니다. 즉, 둘 이상의 부모와의 커밋을 발생시킵니다. 링크 된 질문에 Jefromi's answer에, 그는 git rev-list --merges를 사용하는 것이 훨씬 깔끔 것을 보여줍니다, 그래서 나는 그것을 사용하려면이 스크립트를 업데이트했습니다, 그리고 루프를 고정 :

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

업데이트 :이 훅은 당신이 원하는 일을해야한다 푸시가 업데이트하려고하는 모든 참조에 대해

+0

나 특별한 것이 있습니까. 여기에 내가 얻은 것이 있습니다 : 물건 계산 : 13, 완료. 델타 압축은 최대 4 개의 스레드를 사용합니다. 개체 압축 : 100 % (7/7) 완료. 개체 쓰기 : 100 % (7/7), 668 바이트 완료. 합계 7 (델타 6), 재사용 0 (델타 0) 오류 : 후크를 실행할 수 없거나 사전 수신 : 해당 파일 또는 디렉토리가 없음 ssh : //[email protected]/gitroot/gdcm/ gdcm ! [원격 거부 됨] master -> master (수신 거부 후) 오류 : 'ssh : //[email protected]/gitroot/gdcm/gdcm'에 대한 일부 참조를 푸시하지 못했습니다. – malat

+0

"shebang" 라인은'/ usr/bin/ruby'를 가리 킵니다 - 루비가 그 머신에 설치되어 있고 바이너리가있는 곳이 있습니까? –

+0

(물론 셸 스크립트 나 다른 스크립팅 언어에서도 쉽게 동일하게 처리 할 수 ​​있습니다.) –