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)
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" ].
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:
+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.
Afin d'éviter d'avoir à spécifier complètement la commande git push, vous pouvez également modifier votre fichier de configuration git:
Maintenant, vous pouvez simplement:
C'est selon Gerrit
la source
remote.origin.push
au lieu d'avoir à le taper / le coller à chaque fois!git fetch
etgit push
avec la config @DavidDoria mentionnée ci-dessus.