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)
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" ].
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.
@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:
+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.
Um zu vermeiden, dass Sie den Befehl git push vollständig angeben müssen, können Sie alternativ Ihre git-Konfigurationsdatei ändern:
Jetzt können Sie einfach:
Dies ist nach Gerrit
quelle
remote.origin.push
anstatt es jedes Mal eingeben / einfügen zu müssen!git fetch
undgit push
mit der oben erwähnten Konfiguration @DavidDoria.