2012-01-13 23 views
33

Ho impostato un ramo nel repository remoto e ho eseguito alcune commit su quel ramo. Ora voglio unire il ramo remoto al master remoto.Errore di Gerrit quando manca l'ID di modifica nei messaggi di commit

segue fondamentalmente sono le mie operazioni:

  1. ramo cassa
  2. maestro cassa
  3. unione tra rami e correggere gli errori che si fondono
  4. commettere
  5. spinta origine TESTA: refs/per/master

Ma ottenere messaggi di errore sul 5 ° canale p:

remote: Resolving deltas: 0% (0/12) 

remote: ERROR: missing Change-Id in commit message 
... 

remote: Change-Id: I55862204ef71f69bc88c79fe2259f7cb8365699a 

To ssh://[email protected]:29418/hello_git 
! [remote rejected] HEAD -> refs/for/master (missing Change-Id in commit message) 

risposta

55

Controllare se i vostri commit hanno Change-Id: ... nelle loro descrizioni. Ogni commit dovrebbe averli.

In caso negativo, utilizzare git rebase -i per riformulare i messaggi di commit e aggiungere ID di modifica appropriati (di solito questo è uno SHA1 della prima versione del commit revisionato).

Per il futuro, è necessario installare il commit hook, che aggiunge automaticamente il Change-Id richiesto.

Esegui scp -p -P 29418 [email protected]_gerrit_address:hooks/commit-msg .git/hooks/ nella directory repository o scaricarli da http://your_gerrit_address/tools/hooks/commit-msg e copiare a .git/ganci

+2

esattamente, è una buona soluzione –

+0

Ho trovato che l'ID di cambiamento: può essere perso da Gerrit se aggiungi per es. una riga "Conflitto:" sotto di essa. Quindi assicurati che sia sull'ultima riga del commit. – qneill

+2

@qneill Sembra un bug, puoi segnalarlo allo sviluppatore Gerrit? –

4

È perché Gerrit è configurato per richiedere l'ID di modifica nei messaggi di commit.

http://gerrit.googlecode.com/svn-history/r6114/documentation/2.1.7/error-missing-changeid.html

Devi cambiare i messaggi di ogni commit che si sta spingendo per includere l'id cambio (utilizzando git filter-branch) e solo allora spingere.

+0

corro git commit --amend per risolvere il messaggio di log commit: Qui ci sono i messaggi di log correnti: commit 8152da05ce0235cb779620410474731868664296 Autore: PRC <[email protected]> Data: Giovedì Jan 12 17:24:33 2012 0800 unione mio ramo di padroneggiare Change-Id: I70aee922f6310e4766eb15694deb2fb3579ed042 Ma ancora non si può spingere il ramo al master con gli stessi errori. –

22

Prova questa:

git commit --amend 

quindi copiare e incollare l'Change-Id: I55862204ef71f69bc88c79fe2259f7cb8365699a alla fine del file .

Salvalo e spingilo di nuovo!

+0

Funziona come una soluzione rapida, ma viene fornita la risposta "giusta" @ Rafał Rawicki – HockeyJ

1

Ho ricevuto anche questo messaggio di errore.

e ciò che mi fa pensare che sia utile dare una risposta qui è che la risposta di @ Rafał Rawicki è una buona soluzione in alcuni casi, ma non per tutte le circostanze. esempio che ho incontrato:

1.run "git log" we can get the HEAD commit change-id 

2.we also can get a 'HEAD' commit change-id on Gerrit website. 

3.they are different ,which makes us can not push successfully and get the "missing change-id error" 

soluzione:

0.'git add .' 

1.save your HEAD commit change-id got from 'git log',it will be used later. 

2.copy the HEAD commit change-id from Gerrit website. 

3.'git reset HEAD' 

4.'git commit --amend' and copy the change-id from **Gerrit website** to the commit message in the last paragraph(replace previous change-id) 

5.'git push *' you can push successfully now but can not find the HEAD commit from **git log** on Gerrit website too 

6.'git reset HEAD' 

7.'git commit --amend' and copy the change-id from **git log**(we saved in step 1) to the commit message in the last paragraph(replace previous change-id) 

8.'git push *' you can find the HEAD commit from **git log** on Gerrit website,they have the same change-id 

9.done 
1

abbiamo risolto questo problema questa mattina da ri-clonazione repository e ri-applicazione di modifiche. Questo è il modo più semplice per risincronizzare la tua copia locale con Gerrit. Come sempre abbiamo creato prima un backup.

Sebbene esistano numerose altre soluzioni estremamente complicate, è spesso vantaggioso adottare un approccio semplice per evitare di peggiorare le cose.

6

Se è necessario aggiungere Change-Id a più commit, è possibile scaricare l'hook dal server Gerrit ed eseguire questi comandi per aggiungere gli ID di modifica a tutti i commit che ne hanno bisogno contemporaneamente. L'esempio seguente corregge tutti i commit sul ramo corrente che non sono ancora stati inviati al ramo upstream.

tmp=$(mktemp) 
hook=$(readlink -f $(git rev-parse --git-dir))/hooks/commit-msg 
git filter-branch -f --msg-filter "cat > $tmp; \"$hook\" $tmp; cat $tmp" @{u}..HEAD 
+0

Puoi spiegare come eseguirlo? – user963935

+0

copia questo contenuto in file ed eseguilo come script di shell. – tmp120210

+0

Questo non funziona per me, dice che non ho un upstream configurato. Potresti spiegare cosa stai facendo qui? Inoltre, 'readlink -f' non funziona su mac. –

2

si potrebbe essere un admin di fare un one-off spinta direttamente in refs/changes/<change_number>.

Ad esempio, una volta che un commit senza Id di modifica è atterrato in Subversion, lo si estrae da Subversion usando git-svn e si desidera archiviarlo come patchset di Gerrit in una modifica di Gerrit.

In tal caso, è possibile accedere alla pagina delle impostazioni del progetto (http://[installation-path]/#/admin/projects/[project-id]) e modificare temporaneamente il valore "Richiedi ID di modifica nel messaggio di commit" su False.

Non dimenticare di cambiare in seguito a Inherit or True!

1

Controlla la tua repo git prima di impegnarsi

gitrepo/.git/hooks/commit-msg 

se questo file non è presente in quella posizione allora si otterrà questo errore "mancante Change-Id nel messaggio di commit".

Per risolvere questo, è sufficiente copiare incollare il gancio di commit nella cartella .git.

1

Questo può succedere anche se si dispone di questa restrizione:

Inserisci il messaggio commit per le modifiche. Le righe che iniziano con '#' verranno ignorate e un messaggio vuoto interromperà il commit.

e fate come me: scrivere un messaggio di commit inizia con "#" .....

ho avuto lo stesso errore, ma ho già avuto commit-msg e ha fatto il rebase e tutto. Molto stupido errore però: D