Warum wird Git Push Gerrit HEAD: refs / for / master anstelle von Git Push Origin Master verwendet?

147

Ich habe gerade angefangen, Gerrit zu verwenden, und ich möchte wissen, warum wir es tun müssen, git push gerrit HEAD:refs/for/masteranstatt es zu tungit push origin master

Wenn ich das tue, git push origin masterbekomme ich die Fehlermeldung! [remote rejected] master -> master (prohibited by Gerrit)

Shrayas
quelle

Antworten:

259

In der Dokumentation zu Gerrit, insbesondere im Abschnitt "Push-Änderungen" , wird erläutert, dass Sie refs/for/'branch'mit einem beliebigen Git-Client-Tool zum "magischen Ref " wechseln .

Das folgende Bild stammt aus dem Intro zu Gerrit . Wenn du zu Gerrit drückst, tust du es git push gerrit HEAD:refs/for/<BRANCH>. Dadurch werden Ihre Änderungen in den Staging-Bereich verschoben (im Diagramm "Ausstehende Änderungen"). Gerrit hat eigentlich keinen Zweig namens <BRANCH>; es liegt am git client.

Intern hat Gerrit eine eigene Implementierung für die Git- und SSH-Stacks. Dies ermöglicht es ihm, die "magischen" refs/for/<BRANCH>Refs bereitzustellen .

Wenn eine Push-Anforderung zum Erstellen einer Referenz in einem dieser Namespaces eingeht, führt Gerrit eine eigene Logik zum Aktualisieren der Datenbank aus und belügt den Client über das Ergebnis der Operation. Ein erfolgreiches Ergebnis lässt den Kunden glauben, dass Gerrit den Schiedsrichter erstellt hat, aber in Wirklichkeit hat Gerrit den Schiedsrichter überhaupt nicht erstellt. [ Link - Gerrit, "Gritty Details" ].

Der Gerrit-Workflow

Nach einem erfolgreichen Patch (dh der Patch wurde an Gerrit verschoben, [in den Staging-Bereich "Ausstehende Änderungen" gestellt), überprüft und die Überprüfung ist bestanden), überträgt Gerrit die Änderung von "Ausstehende Änderungen" in " Autorisierendes Repository ", das anhand der Magie berechnet, in die es verschoben werden soll, basierend auf der Magie, in die es verschoben wurde refs/for/<BRANCH>. Auf diese Weise können erfolgreich überprüfte Patches direkt aus den richtigen Zweigen des gezogen werden Authoritative Repository.

simont
quelle
8
Dies ist eine schöne Antwort. Danke :)
Shrayas
1
@Pintolaranja Ich habe das gleiche aus Versehen gemacht. Sie haben Recht, Gerrit "behandelt" eine solche Situation, aber es ändert sich nichts. Eigentlich geht es damit überhaupt nicht um. Was mich wirklich verärgert, da das wirklich dumm ist. Warum sollte der Benutzer zulassen, dass etwas festgeschrieben wird, mit dem Gerrit nicht richtig umgehen kann?
Trejder
1
@gregb Ja. Die Pfeile geben die Quelle und das Ziel des Befehls an, nicht den nachfolgenden Datenfluss. Beispiel: Entwickler 1 gibt einen Abruf an das autorisierende Repository aus, nicht umgekehrt
Gareth,
5
@trejder Dies ist möglich, da Sie mit Gerrit einige Konten so konfigurieren können, dass Überprüfungen umgangen werden. Wenn Sie zum Standardzweig wechseln, sagen Sie effektiv: "Ich möchte diese Änderung ohne Überprüfung zusammenführen." Wenn Sie das nicht dürfen, schlägt der Push fehl.
Hounshell
4
Oder Sie können Gerrit nicht verwenden und dieses lustige Durcheinander ganz vermeiden.
C Johnson
57

Um zu vermeiden, dass Sie den Befehl git push vollständig angeben müssen, können Sie alternativ Ihre git-Konfigurationsdatei ändern:

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

Jetzt können Sie einfach:

git fetch gerrit
git push gerrit

Dies ist nach Gerrit

Sean Murphy
quelle
1
+1 von mir! Es ist viel schöner, wenn ich das nur für mich fest codiert habe, remote.origin.pushanstatt es jedes Mal eingeben / einfügen zu müssen!
DaoWen
7
@SeanMurphy Sie können es allgemeiner gestalten, indem Sie Instanzen von 'master' durch '*' ersetzen, sodass auch etwas wie 'git push gerrit TopicBranch' funktioniert.
David Doria
Wenn Gerrit Ihre einzige Fernbedienung ist, müssen Sie sie überhaupt nicht angeben. Ich mache es einfach git fetchund git pushmit der oben erwähnten Konfiguration @DavidDoria.
Bernk
push = refs / Heads / *: refs / for / * ist für alle Zweige
Victor Choy
Sie müssen wirklich den Upstream-Zweig verwenden, nicht Ihren aktuellen Zweig. Normalerweise laufen ungefähr ein Dutzend Änderungen parallel, sodass die Verwendung eines einzelnen Zweigs einfach nicht funktioniert.
Christian Goetze