Perché git push gerrit HEAD: refs / for / master usato al posto di git push origin master


148

Ho appena iniziato a usare gerrit e voglio sapere perché dobbiamo fare git push gerrit HEAD:refs/for/masterinvece di farlogit push origin master

Se lo faccio git push origin masterottengo l'errore dicendo! [remote rejected] master -> master (prohibited by Gerrit)

Risposte:


259

La documentazione per Gerrit, in particolare la sezione "Cambia modifiche" , spiega che si spinge verso " refs/for/'branch'ref magici usando qualsiasi strumento client Git".

L'immagine seguente è presa dall'Intro a Gerrit . Quando spingi verso Gerrit, lo fai git push gerrit HEAD:refs/for/<BRANCH>. In questo modo le modifiche vengono apportate all'area di gestione temporanea (nel diagramma "Modifiche in sospeso"). Gerrit in realtà non ha un ramo chiamato <BRANCH>; sta al client git.

Internamente, Gerrit ha una propria implementazione per gli stack Git e SSH. Ciò gli consente di fornire i riferimenti "magici" refs/for/<BRANCH>.

Quando viene ricevuta una richiesta push per creare un riferimento in uno di questi spazi dei nomi, Gerrit esegue la propria logica per aggiornare il database e quindi si trova al client sul risultato dell'operazione. Un risultato di successo fa credere al cliente che Gerrit abbia creato l'arbitro, ma in realtà Gerrit non ha creato l'arco. [ Link - Gerrit, "Dettagli grintosi" ].

Il flusso di lavoro di Gerrit

Dopo che una patch ha avuto esito positivo (ovvero, la patch è stata trasferita a Gerrit, [inserendola nell'area di gestione temporanea "In attesa di modifiche"], rivista e la revisione è passata), Gerrit inserisce la modifica da "Modifiche in sospeso" in " Repository autorevole ", che calcola in quale ramo spingerlo in base alla magia che ha fatto quando hai spinto refs/for/<BRANCH>. In questo modo, le patch riviste correttamente possono essere estratte direttamente dai rami corretti di Authoritative Repository.


Per curiosità, cosa succede veramente se fai qualcosa come "git push origin"? L'ho provato e non riesco a vedere il cambiamento da nessuna parte, quindi la domanda. Ma esiste nel mio registro locale, naturalmente.

1
@Pintolaranja Ho fatto lo stesso per caso. Hai ragione, Gerrit "gestisce" tale situazione, ma non crea alcun cambiamento. Quindi, in realtà, non lo gestisce affatto. Il che mi fa davvero incazzare, dato che è davvero stupido. Perché consentire all'utente di impegnare qualcosa che Gerrit non è in grado di gestire correttamente?
Trejder,

1
@gregb Sì. Le frecce indicano l'origine e la destinazione del comando, non alcun flusso di dati successivo a seguito di esso. ad esempio, lo sviluppatore 1 rilascia un recupero al repository autorevole, non viceversa
Gareth,

5
@trejder Lo consente perché Gerrit ti consente di configurare alcuni account per bypassare le recensioni. Spingendo al ramo predefinito stai effettivamente dicendo "Voglio unire questa modifica senza revisione". Se non ti è permesso farlo, il push fallisce.
Hounshell,

4
Oppure non puoi usare gerrit ed evitare del tutto questo casino esilarante.
C Johnson,

57

Per evitare di dover specificare completamente il comando git push, puoi in alternativa modificare il tuo file di configurazione 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

Ora puoi semplicemente:

git fetch gerrit
git push gerrit

Questo è secondo Gerrit


1
+1 da me! È molto più bello avere questo hard-coded per il mio remote.origin.pushinvece di doverlo digitare / incollare ogni volta!
DaoWen,

7
@SeanMurphy Puoi renderlo più generale sostituendo le istanze di 'master' con '*' in modo che anche qualcosa come 'git push gerrit TopicBranch' funzionerà.
David Doria,

Inoltre, se gerrit è il tuo unico telecomando, non è necessario specificarlo affatto. Lo faccio semplicemente git fetche git pushcon la configurazione @DavidDoria di cui sopra.
Bernk,

push = refs / heads / *: refs / for / * è per tutti i rami
Victor Choy

Devi davvero usare il ramo a monte, non il ramo attuale. Di solito ho una dozzina di modifiche in corso, quindi l'uso di un singolo ramo non funziona.
Christian Goetze,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.