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)

Shrayas
la source

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.

Simont
la source
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

Sean Murphy
la source
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