왜 git push gerrit HEAD : git push origin master 대신 refs / for / master가 사용됩니까?


148

방금 gerrit를 사용하기 시작했으며 git push gerrit HEAD:refs/for/master대신에 왜 우리가 해야하는지 알고 싶습니다.git push origin master

내가 git push origin master하면 오류 메시지가 나타납니다! [remote rejected] master -> master (prohibited by Gerrit)

답변:


259

Gerrit에 대한 문서, 특히 "변경 사항 푸시" 섹션에서는 " refs/for/'branch'Git 클라이언트 도구를 사용한 마법의 참조 "에 대해 설명합니다 .

다음 이미지는 인트로에서 Gerrit로 가져온 것입니다 . Gerrit에게 밀면됩니다 git push gerrit HEAD:refs/for/<BRANCH>. 그러면 변경 사항이 준비 영역으로 이동합니다 (다이어그램에서 "변경 보류 중"). Gerrit에는 실제로라는 지점이 없습니다 <BRANCH>. 그것은 자식 클라이언트에 있습니다.

내부적으로 Gerrit은 Git 및 SSH 스택에 대한 자체 구현을 가지고 있습니다. 이를 통해 "매직"참조를 제공 할 수 있습니다 refs/for/<BRANCH>.

이러한 네임 스페이스 중 하나에서 참조를 작성하기위한 푸시 요청이 수신되면 Gerrit은 자체 로직을 수행하여 데이터베이스를 업데이트 한 다음 조작 결과에 대해 클라이언트에게 있습니다. 성공적인 결과는 고객이 Gerrit가 심판을 만들었다 고 믿게하지만 실제로 Gerrit는 심판을 전혀 만들지 않았습니다. [ 링크-Gerrit, "Gritty Details" ].

Gerrit 워크 플로우

패치가 성공적으로 완료된 후 (즉, 패치가 Gerrit로 푸시되어 [ "Pending Changes"스테이징 영역에 배치] 검토되고 검토가 통과 된 후) Gerrit는 "Pending Changes"에서 "Pending Changes"로 변경 사항을 " 신뢰할 수있는 리포지토리 ', 푸시 할 때 수행 한 매직을 기반으로 분기를 푸시 할 지점을 계산합니다 refs/for/<BRANCH>. 이런 식으로, 성공적으로 검토 된 패치는의 올바른 분기에서 직접 가져올 수 있습니다 Authoritative Repository.


호기심에서 "git push origin"과 같은 작업 만 수행하면 실제로 어떻게됩니까? 나는 그것을 시도했지만 어디서나 변화를 볼 수 없으므로 질문. 그러나 자연스럽게 로컬 로그에 존재합니다.

1
@Pintolaranja 나는 우연히 같은 것을했다. 당신이 맞습니다. Gerrit는 그러한 상황을 "처리"하지만 어떠한 변화도 일으키지 않습니다. 실제로 실제로는 처리하지 않습니다. 이것은 정말 어리석기 때문에 나를 화나게합니다. Gerrit이 올바르게 처리 할 수없는 사용자가 무언가를 저 지르도록 허용하는 이유는 무엇입니까?
trejder

1
@gregb 예. 화살표는 명령의 결과로 발생하는 후속 데이터 흐름이 아니라 명령의 소스와 대상을 나타냅니다. 약 1 문제 예를 들어, 개발자는 권위있는 저장소로 가져가 아닌 다른 방법
가레스

5
@trejder Gerrit에서는 리뷰를 우회하도록 일부 계정을 구성 할 수 있습니다. 기본 지점으로 이동하면 "검토하지 않고이 변경 사항을 병합하고 싶습니다"라고 효과적으로 말합니다. 그렇게 할 수 없으면 푸시가 실패합니다.
Hounshell

4
또는 gerrit을 사용할 수 없으며이 끔찍한 혼란을 피할 수 있습니다.
C Johnson

57

git push 명령을 완전히 지정하지 않으려면 git config 파일을 수정하십시오.

[remote "gerrit"]
    url = https://your.gerrit.repo:44444/repo
    fetch = +refs/heads/master:refs/remotes/origin/master
    push = refs/heads/master:refs/for/master

이제 간단하게 할 수 있습니다 :

git fetch gerrit
git push gerrit

Gerrit 에 따르면


1
나에게서 +1! remote.origin.push매번 타이핑하거나 붙여 넣는 대신 하드 코딩 된 것이 더 좋습니다!
DaoWen

7
@SeanMurphy 'git push gerrit TopicBranch'와 같은 것이 작동하도록 'master'의 인스턴스를 '*'로 대체하여 더 일반적으로 만들 수 있습니다.
David Doria

또한 gerrit가 유일한 리모콘이라면 전혀 지정할 필요가 없습니다. 단순히 수행 git fetchgit push는 config로 @DavidDoria는 위에서 언급 한.
bernk

push = refs / heads / * : refs / for / *는 모든 브랜치에 적용됩니다
Victor Choy

현재 지점이 아닌 업스트림 지점을 사용해야합니다. 일반적으로 수십 가지의 변경 사항이 병렬로 진행되므로 단일 브랜치를 사용하면 작동하지 않습니다.
Christian Goetze
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.