Wie kann ich ein bestimmtes Patch-Set von Gerrit ziehen?


75

Wenn ich mit Gerrit (Code Review) arbeite, muss ich häufig eine Kopie eines bestimmten Patch-Sets zu Test- oder Validierungszwecken erhalten. Der naheliegendste und einfachste Weg ist, das Archiv oder die Patch-Datei über die Gerrit-Weboberfläche herunterzuladen und manuell auf meine lokale Quelle anzuwenden.

Während die obigen Schritte ziemlich einfach sind und meine Anforderungen erfüllen, möchte ich in der besten Welt, dass das Patch-Set als Commit in meinem lokalen Git angezeigt wird.

Ich habe mich umgesehen und keine Lösung gefunden. Ich habe einige spärliche Informationen gefunden, die nach dem Zusammenstellen die folgende Lösung ergeben.

Angenommen, Sie möchten das Patch-Set 2 der Gerrit-Änderung 1222 ziehen:

Finden Sie die Remote-Refs, an denen wir interessiert sind:

$ git ls-remote | grep 1220
From http://something.com:8081/MyProject
e2e0212a59240ac5cd7c11220c35542523f44b59        refs/changes/13/713/1
b8c4dceea5eaf1bad711b0ea6938c80ec932726a        refs/changes/20/1220/1
6f20c182ec7f54a2aa9e8f6188a0eef1b0790df4        refs/changes/20/1220/2
ed94a98386d224ce3d86004ce99f61220905a077        refs/changes/22/1222/1

Ziehen Sie die Refs:

git pull origin refs/changes/20/1220/2

Dadurch wird ein Git-Festschreibungspunkt erstellt, den Sie eventuell neu erstellen können:

git rebase

1
Gibt es einen Grund, warum Sie die in der Gerrit-Benutzeroberfläche verfügbaren Standard- Downloadoptionen nicht verwenden ?
Uncletall

Der Grund dafür ist, dass es bequemer ist, das Patch-Set abzurufen, wenn eine ausstehende Codeüberprüfung (von jemand anderem durchgeführt) vorliegt, die ich erhalten möchte, weil ich eine Änderung vornehmen muss. Dadurch kann ich meine Codeänderung sofort einreichen, während der vorherige Festschreibungspunkt noch überprüft wird.
Herve Do

Genau dafür verwenden Sie diese Download-Optionen. Bitte lesen Sie das Dokument und Sie werden verstehen.
Uncletall

2
FWIW ist die weniger fehleranfällige Methode zum Abgleichen von Refs git ls-remote origin 'refs/changes/*/1220/*'.
Tgr

Antworten:


74

Diese Funktion ist Standard in der Gerrit-Benutzeroberfläche.

Klicken Sie oben rechts auf der Benutzeroberfläche für einen Patch auf Herunterladen. Daraufhin wird Folgendes angezeigt:

Gerrit Change Screen herunterladen

Wenn Sie durch die Patches navigieren, gehen Sie zum Download-Bereich und kopieren Sie den Befehlszeilenbefehl zum Auschecken des Patch-Sets, beispielsweise wie folgt:

git fetch https://gerrit.googlesource.com/gerrit refs/changes/03/64403/2 && git checkout FETCH_HEAD

Dann erstelle ich normalerweise einen Zweig mit der Überprüfungsnummer und dem Patchset als Namen

git checkout -b b64403-2

Denn hier können Sie normal arbeiten und Ihre Änderungen festschreiben oder Ihre Änderungen für diese Änderung auswählen / neu festlegen.

Sobald die Überprüfung von r64403 abgeschlossen ist, kann Ihr Code zusammengeführt werden. Wenn ein anderes Patchset gesendet wird, müssen Sie dasselbe erneut tun.

Wenn Sie die Optionen zum Herunterladen der Option nicht sehen Checkoutoder die Option Cherry Pickbearbeiten müssen gerrit.config, gehen Sie wie folgt vor:

[download]
    scheme = ssh
    command = checkout
    command = cherry_pick

Weitere Details finden Sie in der Gerrit-Dokumentation


Update: Wie barryku richtig hervorhebt , müssen Sie in der späteren Version das Download- Befehls -Plugin herunterladen. Dies kann während der Ersteinrichtung oder mit dem folgenden Befehl erfolgen:

java -jar gerrit-2.11.4.war init -d review_site --batch --install-plugin download-commands

Interessant. Ich habe nicht die Optionen "Checkout" und "Cherry Pick" unter "Download". Ich habe nur "Patch-File" und "Archive". Vielleicht einige Gerrit-Administratoroptionen, damit "Checkout" und "Cherry Pick" angezeigt werden? Oder müssen Sie möglicherweise auf eine neuere Version von Gerrit aktualisieren?
Herve Do

2
Das entsprechende Beispiel für den Abschnitt gerrit.config wurde hinzugefügt.
Uncletall

1
Vielen Dank, ich habe das in der Benutzeroberfläche völlig übersehen, und es hat eine Weile gedauert, bis ich eine einfache Antwort wie diese gefunden habe.
SpoonMeiser

2
Ich hatte meinen Gerrit-Server mehrmals neu gestartet, nachdem ich das Download-Plugin ohne Erfolg konfiguriert hatte. Es stellte sich heraus, dass die Datei download-command.jar fehlt. Nach dem Kopieren des fehlenden Glases aus der Kriegsdatei werden diese Links schließlich angezeigt. Ich bin nicht sicher, ob es daran liegt, dass mein Server zuvor von 2.x aktualisiert wurde. Für den Fall, dass jemand auf dieses Problem stößt , können Sie unter gerrit-documentation.storage.googleapis.com/ReleaseNotes/… weitere Informationen finden.
Barryku

47

Oder Sie können die -dOption zum Git-Review verwenden . Angenommen, Sie haben mit dem Nova-Docker- Repository gearbeitet und waren an dieser Änderung in Gerrit interessiert:

Sie können das neueste Patchset folgendermaßen herunterladen:

git review -d 148486

Oder Sie können die Änderungs-ID verwenden:

git review -d I35729a86e211391f67cc959d19416c9125c6f9eb

Sie können auch eine bestimmte Revision des Patches anfordern, indem Sie ein Komma und die Patch-Nummer anhängen. Zum Beispiel, um die zweite Revision dieses Patches zu erhalten:

git review -d 148486,2

Vielen Dank für den Tipp, aber es sieht so aus, als würde ich weitere Einstellungen benötigen, um die Git-Überprüfung zu verwenden, da ich eine Fehlermeldung erhalte (siehe unten). $ git review -d I85be47d597611508f5dd9360145bbe2f67cb2148 In diesem Repository wurde keine '.gitreview'-Datei gefunden. Wir wissen nicht, wo Ihr Gerrit ist. Bitte erstellen Sie manuell eine Fernbedienung mit dem Namen "gerrit" und versuchen Sie es erneut.
Herve Do

Ah, ich nahm an, da Sie mit Gerrit gearbeitet haben, das Sie bereits verwendet haben git-review. Eine .gitreviewDatei sieht ungefähr so aus .
Larsks

1
git review -ssollte diese Datei einrichten.
Volker

1
@volker, Sie benötigen zuerst die .gitreviewDatei (ansonsten git review -swissen Sie nicht, wo sich Ihre Gerrit-Fernbedienung befindet ...). Wenn Sie dies ohne .gitreviewDatei versuchen , wird in diesem Repository die Datei "No '.gitreview' angezeigt. Wir wissen nicht, wo sich Ihr Gerrit befindet. Erstellen Sie manuell eine Fernbedienung mit dem Namen" Gerrit "und versuchen Sie es erneut."
Larsks

Beachten Sie, dass Sie abhängig von der Version des Gerrit-Repos selbst möglicherweise sicherstellen müssen, dass der git-reviewWert 1,27+ beträgt (siehe phabricator.wikimedia.org/T194520#5446026 )
Lokal_Profil

10

Ich bin mir nicht 100% sicher, was Ihre Frage ist. Klingt so, als ob Sie den Workflow oder das Tippen vereinfachen möchten. bereits erwähnte Larsks, git reviewdie meistens verwendet werden.

In Ihrem Fall ist es möglicherweise hilfreich, alle Verweise automatisch herunterzuladen, damit Sie sie direkt referenzieren können . Sie können immer alle angegebenen Referenzen wie mit

git fetch origin "+refs/changes/*:refs/remotes/origin/changes/*" 

Dann können Sie lokal mit der Commit-ID arbeiten .

Ein einfacher Git-Alias ​​oder ein Skript für alle Refs kann einfach durchgeführt werden. Ein Beispiel für eine solche while-Schleife finden Sie im Skript unter https://github.com/saper/gerrit-fetch-all. Mit einem so kleinen Shell-Snippet können Sie leicht einen Teil der Referenz-ID überspringen, um leichter darauf zugreifen zu können Sie:

    Server side:                 Client side:
    refs/changes/13/713/1        refs/head/713/1
    refs/changes/20/1220/1       refs/head/1220/1
    refs/changes/20/1220/2       refs/head/1220/2
    refs/changes/22/1222/1       refs/head/1222/1

Die Frage ist, wie man ein Patch-Set von Gerrit zieht, und ich beantwortete die Frage auch, indem ich mitteilte, wie ich es mache. Ich habe git-review noch nie benutzt, bevor ich meine Frage geschrieben habe.
Herve Do

2
Für uns, die nur gitalle Änderungen abrufen möchten und keine bestimmten Gerrit-Tools installieren oder konfigurieren müssen, ist dies die richtige Antwort.
Hugo Josefson

6

Wie in den Kommentaren erwähnt, können Sie einfach den richtigen git-Befehl über die gerrit-GUI abrufen. Wenn Sie GUIs wirklich nicht mögen oder sie automatisieren möchten (und aus irgendeinem Grund nicht verwenden können git-review), können Sie die gerrit-API verwenden:

curl -s 'https://<your gerrit server>/r/changes/<change id>?o=CURRENT_REVISION&o=DOWNLOAD_COMMANDS' | tail -n+2 | jq -r '.revisions[.current_revision].fetch["anonymous http"].commands.Pull' | bash -

oder

git pull origin `curl -s 'https://<your gerrit server>/r/changes/<change id>?o=CURRENT_REVISION' | tail -n+2 | jq -r '.revisions[.current_revision].ref'`
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.