web-dev-qa-db-fra.com

Comment git-tirer un jeu de patchs donné de Gerrit?

Lorsque je travaille avec Gerrit (Code Review), j’ai souvent besoin d’une copie d’un ensemble de correctifs à des fins de test ou de validation. La méthode la plus simple et la plus simple consiste à télécharger l’archive ou le fichier de correctif via l’interface Web de Gerrit et à l’appliquer manuellement à ma source locale.

Bien que les étapes ci-dessus soient assez simples et répondent à mes besoins, dans le meilleur des mondes, j'aimerais que l'ensemble de correctifs apparaisse comme un commit dans mon Git local.

Je cherchais autour de moi et n'ai pas trouvé la solution. J'ai trouvé quelques informations éparses qui, une fois compilées ensemble, donnent la solution suivante.

Dites que vous voulez tirer le jeu de correctifs 2 du changement 1222 de Gerrit:

Trouver les références à distance qui nous intéressent:

$ 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

Tirez les refs:

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

Cela créera un point de validation Git que vous pourrez éventuellement rebaser:

git rebase
58
Herve Thu

Cette fonctionnalité est standard dans l'interface utilisateur Gerrit.

En haut à droite de l'interface utilisateur d'un correctif, cliquez sur Télécharger et vous verrez quelque chose comme:

Gerrit Change Screen Download

Lorsque vous parcourez les correctifs, accédez à la section de téléchargement et copiez la commande en ligne de commande pour extraire le jeu de correctifs, par exemple comme ceci:

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

Ensuite, je crée normalement une branche avec le numéro d'examen et le patchset comme nom

git checkout -b b64403-2

Car ici, vous pouvez travailler normalement et valider vos modifications ou choisir vos modifications sur cette modification.

Une fois que l'examen de r64403 est terminé, votre code peut être fusionné ou lorsqu'un nouveau patchset est soumis, vous devrez refaire la même chose.

Si vous ne voyez pas les options pour télécharger l’option sur Checkout ou Cherry Pick vous devez éditer le gerrit.config, quelque chose comme ça:

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

Plus de détails peuvent être trouvés dans le Documentation Gerrit


Mise à jour: Comme barryk le fait remarquer correctement, dans la version ultérieure, vous devez télécharger le plug-in downloads-controls. Cela peut être fait lors de la configuration initiale ou en utilisant la commande suivante:

Java -jar gerrit-2.11.4.war init -d review_site --batch --install-plugin download-commands
63
uncletall

Ou vous pouvez utiliser le -d option à git-review. Par exemple, en supposant que vous travailliez sur le référentiel with nova-docker et que ce changement de gerrit vous intéresse:

Vous pouvez télécharger le dernier patchset comme ceci:

git review -d 148486

Ou vous pouvez utiliser l'identifiant de changement:

git review -d I35729a86e211391f67cc959d19416c9125c6f9eb

Vous pouvez également demander une révision spécifique du correctif en ajoutant une virgule et le numéro du correctif. E.g, pour obtenir la deuxième révision de ce correctif:

git review -d 148486,2
40
larsks

Je ne suis pas sûr à 100% de votre question. On dirait que vous voulez faciliter le flux de travail ou la frappe. larsks déjà mentionné git review qui est le plus souvent utilisé.

Pour votre cas, il serait peut-être utile de télécharger automatiquement toutes les références afin de pouvoir les référencer directement . Vous pouvez toujours toutes les références spécifiées comme avec

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

Ensuite, vous pouvez travailler localement avec l'ID de validation .

Un simple alias git ou un script pour toutes les références peut être fait facilement. Un exemple d'une telle boucle while peut être trouvé dans le script sur https://github.com/saper/gerrit-fetch-all Avec un si petit fragment de shell, vous pouvez facilement accomplir pour sauter une partie. du ref id pour les référencer plus facilement:

    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
8
volker

Comme mentionné dans les commentaires, vous pouvez simplement obtenir la bonne commande git à partir de l'interface graphique de gerrit. Si vous n'aimez vraiment pas les interfaces graphiques, ou si vous voulez l'automatiser (et pour une raison quelconque, ne pouvez pas utiliser git-review), vous pouvez utiliser l’API gerrit:

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 -

ou

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'`
5
Tgr