2013-07-26 17 views
11

Sto tentando di applicare una patch a un file utilizzando git apply. La patch complessiva non è riuscita, quindi ho usato git apply --reject.Come applicare gli hunk rifiutati dopo averli risolti?

L'ispezione del file .rej generato mi ha mostrato cosa c'è che non va, ora ho risolto il problema nel file .rej.

Ma cercando di applicare il file .rej fallisce con il messaggio

fatale: frammento di patch senza intestazione alla linea 2: ...

C'è un modo per ri-applicare la .rej file dopo aver risolto i problemi lì? Oppure devo modificare la patch originale e devo eseguire nuovamente git apply?

Questo sarebbe un po 'macchinoso in quel caso poiché la patch originale contiene patch per dozzine di file e non voglio git checkout le modifiche applicate per ri-git apply l'intero file di patch fisso.

risposta

6

Per chiarire what @julian-squires said, il problema è che i file .rej mancano alcune cose minori tra diff a/thefile... e @@ -line/columns....

ORIGINALE .rej file di

diff a/the/original/file.cs b/the/original/file.cs (rejected hunks) 
@@ -27,9 +27,9 @@ whatever was on that line 

È necessario copiare l'a/i nomi dei file B dalla linea diff e aggiungerle con gli indicatori di cambio di seguito, come:

AGGIORNATO .rej file

diff a/the/original/file.cs b/the/original/file.cs (rejected hunks) 
--- a/the/original/file.cs 
+++ b/the/original/file.cs 
@@ -27,9 +27,9 @@ whatever was on that line 

allora si può applicare i file .rej come un cerotto normale.

+0

Grazie per la spiegazione. Controllerò la tua risposta perché è semplice inglese invece di semplice Bash ... – eckes

0

Non è possibile modificare manualmente i file in cui è presente un file .rej. Hai detto che hai risolto questo problema. Una volta che tutti i problemi .rej sono stati risolti, sei pronto per git commit. git apply --reject salva ancora un po 'di tempo in quanto git apply --reject modificherà i file dove possibile.

2

Ho avuto questo problema di recente, durante l'utilizzo di git am --reject per applicare un sacco di patch. Il modo in cui mi sono avvicinato era per massaggiare l'intestazione .rej file in qualcosa di patch(1) riconoscerebbe, con

sed -e 's/^diff a\/\(.*\) b\/\(.*\)[[:space:]].*rejected.*$/--- \1\n+++ \2/' 

e modificato con emacs (la cui diff-mode aggiornerà la linea conta negli hunk come si modifica la patch) e applicata loro con patch.

mio flusso di lavoro ha finito per assomigliare a questo:

$ (for i in $(find . -name \*.rej); do 
    sed -e 's/^diff a\/\(.*\) b\/\(.*\)[[:space:]].*rejected.*$/--- \1\n+++ \2/' -i $i && 
    emacsclient $i && 
    patch -p0 < $i; 
    done) && git add -u && git clean -xdf && git am --continue 

con adeguata messa a punto delle macro in emacs per i casi ricorrenti. Non l'approccio più elegante, ma ha funzionato.

+0

purtroppo, [Non riesco a parlare Linux ...] (http://stackoverflow.com/a/28569128/1037948) – drzaus

Problemi correlati