Je viens de commencer à utiliser gerrit et je veux savoir pourquoi nous devons faire git Push gerrit HEAD:refs/for/master
au lieu de git Push Origin master
Si je fais git Push Origin master
j'obtiens l'erreur disant ! [remote rejected] master -> master (prohibited by Gerrit)
La documentation de Gerrit, en particulier la section "Modifications poussées" , explique que vous transmettez à "magical refs/for/'branch'
ref à l'aide de n'importe quel outil client Git".
L'image suivante est tirée de Intro to Gerrit . Lorsque vous appuyez sur Gerrit, vous faites git Push gerrit HEAD:refs/for/<BRANCH>
. Cela reporte vos modifications dans la zone d'activation (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 le "magique" refs/for/<BRANCH>
refs.
Lorsqu'une demande Push est reçue pour créer une référence dans l'un de ces espaces de noms, Gerrit applique 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 fait croire au client que Gerrit a créé l’arbitre, mais qu’en réalité, Gerrit n’a pas créé l’arbitre. [ Link - Gerrit, "Gritty Details" ].
Après un correctif correct (c’est-à-dire que le correctif a été transmis à Gerrit, [placé dans la zone de transfert "Modifications en attente"], examiné et que la révision est terminée), Gerrit insère le changement de "Modifications en attente" dans le " Authoritative Repository ", qui calcule la branche dans laquelle le pousser. En fonction de la magie qu’il faisait lorsque vous avez poussé vers refs/for/<BRANCH>
. De cette façon, les correctifs révisés avec succès peuvent être extraits directement des branches appropriées du Authoritative Repository
.
Pour éviter de 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