Pourquoi git push gerrit HEAD: refs / for / master est-il utilisé à la place de git push origin master


148

Je viens de commencer à utiliser gerrit et je veux savoir pourquoi nous devons faire git push gerrit HEAD:refs/for/masterau lieu de fairegit push origin master

Si je le fais, git push origin masterj'obtiens l'erreur disant! [remote rejected] master -> master (prohibited by Gerrit)

Réponses:


259

La documentation de Gerrit, en particulier la section "Push changes" , explique que vous poussez vers le "magical refs/for/'branch'ref using any Git client tool".

L'image suivante est tirée de l'Intro to Gerrit . Lorsque vous poussez vers Gerrit, vous le faites git push gerrit HEAD:refs/for/<BRANCH>. Cela pousse vos modifications dans la zone de préparation (dans le diagramme, «Modifications en attente»). Gerrit n'a pas réellement de branche appelée <BRANCH>; il ment au client git.

En interne, Gerrit a sa propre implémentation pour les piles Git et SSH. Cela lui permet de fournir les refs/for/<BRANCH>références "magiques" .

Lorsqu'une demande push est reçue pour créer une référence dans l'un de ces espaces de noms, Gerrit exécute sa propre logique pour mettre à jour la base de données, puis ment au client sur le résultat de l'opération. Un résultat réussi amène le client à croire que Gerrit a créé la référence, mais en réalité, Gerrit n'a pas du tout créé la référence. [ Lien - Gerrit, "Gritty Details" ].

Le flux de travail Gerrit

Après un correctif réussi (c'est-à-dire, le correctif a été poussé vers Gerrit, [en le plaçant dans la zone de préparation "Modifications en attente"], revu et la révision est passée), Gerrit pousse le changement de "Modifications en attente" dans le " Référentiel faisant autorité ", calculant dans quelle branche le pousser en fonction de la magie qu'il a exercée lorsque vous l'avez poussé refs/for/<BRANCH>. De cette façon, les correctifs examinés avec succès peuvent être extraits directement des branches correctes du Authoritative Repository.


Par curiosité, que se passe-t-il vraiment si vous faites quelque chose comme "git push origin" uniquement? Je l'ai essayé et je ne peux voir le changement nulle part, donc la question. Mais cela existe dans mon journal local, naturellement.

1
@Pintolaranja J'ai fait la même chose accidentellement. Vous avez raison, Gerrit "gère" une telle situation, mais cela ne crée aucun changement. Donc en fait, il ne le gère pas du tout. Ce qui me fait vraiment chier, car c'est vraiment stupide. Pourquoi autoriser l'utilisateur à valider quelque chose que Gerrit est incapable de gérer correctement?
trejder

1
@gregb Oui. Les flèches indiquent la source et la destination de la commande, et non le flux de données qui en résulte. Par exemple, le développeur 1 émet une extraction vers le référentiel faisant autorité, et non l'inverse
Gareth

5
@trejder Cela permet cela car Gerrit vous permet de configurer certains comptes pour contourner les avis. En poussant vers la branche par défaut, vous dites en fait "Je veux fusionner ce changement sans examen". Si vous n'êtes pas autorisé à le faire, le push échoue.
Hounshell

4
Ou vous ne pouvez pas utiliser gerrit et éviter complètement ce désordre hilarant.
C Johnson

57

Afin d'éviter d'avoir à spécifier complètement la commande git push, vous pouvez également modifier votre fichier de configuration git:

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

Maintenant, vous pouvez simplement:

git fetch gerrit
git push gerrit

C'est selon Gerrit


1
+1 de moi! C'est bien plus agréable d'avoir ce codé en dur pour moi remote.origin.pushau lieu d'avoir à le taper / le coller à chaque fois!
DaoWen

7
@SeanMurphy Vous pouvez le rendre plus général en remplaçant les instances de «master» par «*» afin que quelque chose comme «git push gerrit TopicBranch» fonctionne également.
David Doria

De plus, si gerrit est votre seule télécommande, vous n'avez pas du tout à le spécifier. Je fais simplement git fetchet git pushavec la config @DavidDoria mentionnée ci-dessus.
bernk

push = refs / heads / *: refs / for / * est pour toutes les branches
Victor Choy

Vous devez vraiment utiliser la branche amont, pas votre branche actuelle. J'ai généralement une douzaine de changements en parallèle, donc utiliser une seule branche ne fonctionne tout simplement pas.
Christian Goetze le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.