2012-05-05 13 views

risposta

203

la documentazione per Gerrit, in particolare la sezione "Push changes", spiega che si spinge alla "magica refs/for/'branch' rif utilizzando qualsiasi strumento client Git".

L'immagine seguente è presa da the Intro to Gerrit. Quando si spinge a Gerrit, si fa git push gerrit HEAD:refs/for/<BRANCH>. Ciò trasferisce le modifiche all'area di gestione (nel diagramma "Modifiche in sospeso"). Gerrit in realtà non ha un ramo chiamato <BRANCH>; sta al cliente git.

Internamente, Gerrit ha una propria implementazione per gli stack Git e SSH. Questo gli permette di fornire i "magici" ref refs/for/<BRANCH>.

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

The Gerrit workflow

Dopo una patch di successo (vale a dire, la patch è stato spinto a Gerrit, [mettendolo in "Pending Changes" area di sosta], rivisto, e la revisione è stata superata), Gerrit spinge il passaggio dalle "Modifiche in sospeso" al "Repertorio autorevole", calcolando il ramo per inserirlo in base alla magia che ha fatto quando hai spinto a refs/for/<BRANCH>. In questo modo, le patch riesaminate con successo possono essere estratte direttamente dai rami corretti di Authoritative Repository.

+6

Questa è una bellissima risposta. Grazie :) – Shrayas

+0

Per curiosità, cosa succede veramente se fai qualcosa come "git push origin" solo? L'ho provato e non vedo la modifica 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, perché è davvero stupido. Perché consentire all'utente di commettere qualcosa, che Gerrit non è in grado di gestire correttamente? – trejder

37

Al fine di evitare di dover specificare completamente il comando git push si potrebbe in alternativa, modificare il vostro git file di configurazione:

[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 si può semplicemente:

git fetch gerrit 
git push gerrit 

Questo è secondo Gerrit

+1

+1 da parte mia! È molto più bello avere questo hard-coded per il mio 'remote.origin.push' invece di doverlo digitare/incollarlo ogni volta! – DaoWen

+0

Funziona come un incantesimo –

+5

@SeanMurphy Puoi renderlo più generale sostituendo le istanze di 'master' con '*' in modo che anche qualcosa come 'git push gerrit TopicBranch' funzioni. –