2013-08-01 5 views
12

Sto tentando di utilizzare la cache rerere condivisa per automatizzare i rami di integrazione/test di estrazione.git rerere non esegue il commit automatico delle risoluzioni di fusione autorizzate

L'idea è che la cache di rerere debba essere aggiornata quando viene eseguito il push del ramo, in modo che questi si uniscano sempre. Tuttavia, non è così:

>>> git merge --no-ff invoicing 
Staged 'analysisrequest.py' using previous resolution. 
Staged '__init__.py' using previous resolution. 
Auto-merging __init__.py 
CONFLICT (content): Merge conflict in __init__.py 
Auto-merging analysisrequest.py 
CONFLICT (content): Merge conflict in analysisrequest.py 
Automatic merge failed; fix conflicts and then commit the result. 

A questo punto, rerere ha messo in scena le risoluzioni che ricordavo, e non esiste alcun conflitto vero e proprio. Posso eseguire git commit, quindi continuare, ma il mio script di integrazione-test-build rileva un errore. Ho provato ad aggiungere --rerere-autoupdate al comando git merge, ma non cambia nulla. Ho configurato il repository per abilitare e applicare automaticamente le corrispondenze rerere.

Come posso chiedere a git merge di utilizzare le mie risoluzioni precedenti e continuare senza fallire se sono sufficienti?

+0

La situazione dovrebbe migliorare presto con Git 2.14.x/2.15 (Q3 2017): https://stackoverflow.com/a/45988818/6309 – VonC

risposta

10

Anche con il flag --rerere-autoupdate, git merge sembra essere riluttante a completare automaticamente l'unione senza alcun input umano. In questo caso, viene eseguito con uno stato di errore e il tuo strumento di integrazione rifiuta di procedere.

Non so come sta avvenendo la fusione automatica, vale a dire se è possibile modificare il comando git che viene eseguito. Se puoi, allora puoi eseguire i seguenti comandi.

git merge --no-ff branch-to-merge --rerere-autoupdate 
if [[ $(git rerere diff) ]] 
then 
    git commit --no-edit 
else 
    $(exit 1) 
fi 
  • git rerere diff file di elenco che devono essere risolti dopo rerere
  • --no-edit è necessario per evitare che l'apertura del messaggio editor di
  • commettere In caso rerere non era in grado di unire in modo pulito tutte le modifiche questa informativa saranno ancora eseguire con uno stato di errore e l'unione non verrà eseguita.
    • Il messaggio di commit conterrà ancora i file in conflitto
  • exit 1 ha bisogno di essere dentro $() a meno che non si vuole uscire la shell (immagino come so che questo :-))
+1

Grazie per aver dedicato del tempo. Ho vissuto con questa mancanza per così tanto tempo che è diventato parte della mia danza ..... – Campbell

+0

Il solito modo di evitare '$ (exit 1)' è usare lo standard UNIX 'false' (o' true') comandi – sehe