git: patch non applicabile


289

Ho una certa patch chiamata my_pcc_branch.patch.

Quando provo ad applicarlo, ricevo il seguente messaggio:

$ git apply --check my_pcc_branch.patch
warning: src/main/java/.../AbstractedPanel.java has type 100644, expected 100755
error: patch failed: src/main/java/.../AbstractedPanel.java:13
error: src/main/java/.../AbstractedPanel.java: patch does not apply

Cosa significa?

Come posso risolvere questo problema?


Ci sono file AbstractedPanel.java.rej in giro? Tipicamente questo significa che un bot di linea è cambiato sia nel sorgente che nella patch (qui la linea 13 sembra essere interessata).
Rudi,

No, non ho trovato alcun file * .rej.
Dmitrii Pisarenko,

Non sei sicuro del perché la risposta accettata lo risolva (quindi sospetto che sia un'aringa rossa), ma non has type 100644, expected 100755implica che ci sia una mancata corrispondenza delle autorizzazioni chmod da qualche parte?
ruffin,

Risposte:


325

git apply --reject --whitespace=fix mychanges.patch ha funzionato per me.

Spiegazione

L' --rejectopzione indicherà a git di non fallire se non riesce a determinare come applicare una patch, ma invece di applicare hunk individuali può applicare e creare file di rifiuto ( .rej) per hunk che non può applicare. Wiggle può "applicare [queste] patch rifiutate ed eseguire diffs di parole".

Inoltre, --whitespace=fix avviserà degli errori degli spazi bianchi e proverà a risolverli, piuttosto che rifiutare di applicare un pezzo altrimenti applicabile.

Entrambe le opzioni insieme rendono l'applicazione di una patch più robusta contro i guasti, ma richiedono ulteriore attenzione rispetto al risultato.

Per l'intera documentazione, consultare https://git-scm.com/docs/git-apply .


8
Questo in realtà ha funzionato meglio per me perché non ha modificato completamente il mio file
Wayne Werner il

10
Questo è fantastico Rifiuta solo ciò che non può risolvere da solo e puoi quindi modificare manualmente i file rifiutati manualmente.
Dennis,

1
patch -p1 <mychanges.patch # applica le modifiche pezzo per pezzo. Se le modifiche falliscono, vengono create una patch <sourcefile> .orig e <sourcefile> .rej ed è possibile applicare le modifiche manualmente. Suppongo che git apply --reject faccia lo stesso e --whitespace = fix sia magicamente migliore.
gennaio

7
questo comando crea .rejfile quando non è possibile rilevare automaticamente come applicare una patch. È possibile utilizzare wiggle per risolvere tali problemi.
goodniceweb,

14
Questa risposta non spiega nulla, in particolare in quali casi funzionerà. Gente, dovete davvero essere più esigenti in termini di qualità della risposta, questo NON è un forum.
Oliver

319

Johannes Sixt dalla mailing list msysgit@googlegroups.com ha suggerito di utilizzare i seguenti argomenti della riga di comando:

git apply --ignore-space-change --ignore-whitespace mychanges.patch

Questo ha risolto il mio problema.


25
Qualcuno può aiutarmi e spiegare perché questo funziona? L'altra risposta non ha funzionato per me e ho avuto lo stesso identico problema descritto dalla domanda. Che cosa hanno a che fare gli attributi di file ignorando gli spazi bianchi?
skrebbel,

1
Uso di windows powershell Una patch creata con git diff è stata correttamente applicata come segue: git diff HEAD..613fee - myfile.xml | git apply --ignore-space-change --ignore-whitespace, mentre il primo salvataggio dell'output diff come file non ha funzionato, nel caso in cui qualcuno
incontri

2
prova anche a -C1cambiare per applicare, riduce il contesto attorno alle aggiunte considerate importanti.
Amir Ali Akbari,

2
@EricWalker, git magic con CR / LF non è necessariamente una cosa negativa. L'alternativa può essere che metà dei cambiamenti sia costituita da ogni singola riga in ogni file che è stato toccato mentre viene cambiata da una riga che termina all'altra, con la modifica effettiva sepolta da qualche parte nel mezzo.
jwg

3
Questo aiuta a volte. Ma altre volte, ottengo ancora la "patch non applicabile", anche se la patch dovrebbe applicarsi senza problemi.
Thomas Levesque,

118

Quando tutto il resto fallisce, prova git applyl' --3wayopzione .

git apply --3way patchFile.patch

--3way
Se la patch non si applica in modo pulito, ricorrere all'unione a 3 vie se la patch registra l'identità dei BLOB a cui dovrebbe applicarsi e abbiamo tali BLOB disponibili localmente, lasciando eventualmente i marker di conflitto nei file in l'albero di lavoro che l'utente può risolvere. Questa opzione implica l'opzione --index ed è incompatibile con le opzioni --reject e --cached.

Il tipico caso di fallimento applica la maggior parte possibile della patch e ti lascia con i conflitti per allenarti in Git, tuttavia normalmente lo fai. Probabilmente un passo più semplice rejectdell'alternativa.


2
Questa è la risposta che ha funzionato per me. Il file che stavo correggendo non rifletteva le modifiche da cui ho generato la patch (perché ho eliminato le modifiche dopo aver creato la patch.)
Christia,

3
Bella soluzione generale. Il diff a 3 vie non sembrava che fosse così un po 'confuso da ciò, ma ciò nonostante mi ha dato la possibilità di risolvere il conflitto e far applicare la patch.
steinybot,

8
Penso che questo --3waydovrebbe essere il comportamento predefinito. Quando il patching fallisce, almeno dimmi cosa non è riuscito in modo da poterlo riparare manualmente. git applynon riesce e non segnala perché qualcosa non funziona. Non sono nemmeno riuscito a trovare *.rejfile come quelli hggenerati.
Pavan Manjunath,

4
Sicuramente, la soluzione migliore. Lascia che l'utente risolva i propri conflitti!
Mosh Feu,

56

Questo comando applicherà la patch non risolvendola lasciando file danneggiati come *.rej:

git apply --reject --whitespace=fix mypath.patch

Devi solo risolverli. Una volta risolta la corsa:

git -am resolved

7
come risolvere *.rej- tutto quello che posso trovare è apportare manualmente le modifiche nel file di origine ed eliminare questi .rejfile. Qualsiasi altro modo ?
coding_idiot

1
@coding_idiot Come al solito, basta controllare i file .rej, confrontarli con i file in conflitto e infine aggiungere i file fissi all'indice (con "git add FIXED_FILES")
Ivan Voroshilin,

2
@coding_idiot potresti usare wiggle per risolverlo. Ad esempio: wiggle --replace path/to/file path/to/file.rej. Questo comando applicherà le modifiche dal .rejfile al file originale. Inoltre crea una copia del file originale, come path/to/file.porig. Per favore, controlla la documentazione per avere maggiori informazioni su wiggle
goodniceweb

22

Prova a utilizzare la soluzione suggerita qui: https://www.drupal.org/node/1129120

patch -p1 < example.patch

Questo mi ha aiutato.


3
So che non dovresti farlo, ma GRAZIE TANTO! Mi ha salvato ore. Stavo ottenendo "patch non applicabile" e tutti i tipi di errori.
sudo rm -rf slash

@ sudorm-rfslash, perché non dovremmo farlo e perché lo facevi comunque?
Nero

git: 'patch' is not a git command.ongit version 2.21.1 (Apple Git-122.3)
Sridhar Sarnobat,

16

Succede quando si mescolano client UNIX e Windows git perché Windows non ha davvero il concetto del bit "x", quindi il checkout di un rw-r--r--file (0644) in Windows viene "promosso" dal livello POSIX di msys come rwx-r-xr-x(0755) . git considera che la differenza di modalità sia sostanzialmente la stessa di una differenza testuale nel file, quindi la tua patch non si applica direttamente. Penso che la tua unica buona opzione qui sia quella core.filemodedi false(usandogit-config ).

Ecco un problema di msysgit con alcune informazioni correlate: http://code.google.com/p/msysgit/issues/detail?id=164 (reindirizzato alla copia del 3 dicembre 2013 di archive.org)


2
Ho provato a eseguire il comando "git config core.filemode false", ma non mi è stato d'aiuto: sto ancora ricevendo lo stesso messaggio.
Dmitrii Pisarenko,

Supponendo che non siano presenti modifiche non impegnate nella struttura, provare git reset --hard HEADa forzare git a ricontrollare i file con la nuova opzione attiva.
Ben Jackson,

Appena provato esegui "git reset --hard HEAD". Ha avuto successo (ho visto il messaggio "HEAD is now at ..."), ma il problema con "git apply" persiste.
Dmitrii Pisarenko,

7

Nel mio caso sono stato abbastanza stupido da creare il file patch in modo errato, in primo luogo, differendo in realtà nel modo sbagliato . Ho finito con gli stessi identici messaggi di errore.

Se sei un maestro e lo fai git diff branch-name > branch-name.patch , questo cerca di rimuovere tutte le aggiunte che vuoi che accadano e viceversa (il che era impossibile per Git realizzare poiché, ovviamente, le aggiunte mai fatte non possono essere rimosse).

Quindi assicurati di effettuare il checkout alla tua filiale ed eseguire git diff master > branch-name.patch


3

ATTENZIONE: questo comando può rimuovere PERMANENTEMENTE i vecchi commit persi. Crea una copia dell'intero repository prima di tentare.

Ho trovato questo link

Non ho idea del perché funzioni, ma ho provato molte soluzioni e questo è l'unico che ha funzionato per me. In breve, esegui i tre comandi seguenti:

git fsck --full
git reflog expire --expire=now --all
git gc --prune=now

3
Questo è un comando molto pericoloso che può rimuovere i vecchi commit persi per sempre dal reflog. Se il repository si trova in uno stato instabile, NON APPLICARLO.
ET

0

Quello che ho cercato non è esattamente sottolineato qui in SO, sto scrivendo per il beneficio di altri che potrebbero cercare simili. Ho riscontrato un problema con un file (presente nel vecchio repository) che veniva rimosso nel repository. E quando applico la patch, fallisce perché non riesce a trovare il file da applicare. (quindi il mio caso è che la patch git non riesce per il file rimosso) '#git apply --reject' sicuramente ha dato una vista ma non mi ha portato alla correzione. Non ho potuto usare wiggle in quanto non è disponibile per noi nei nostri server di build. Nel mio caso, ho risolto questo problema rimuovendo la voce del 'file che è stato rimosso nel repository' dal file patch che ho provato ad applicare, quindi ho applicato tutte le altre modifiche senza problemi (usando l'unione a 3 vie, evitando errori di spazio bianco), quindi unendo manualmente il contenuto del file rimosso nel punto in cui è stato spostato.


0

Il mio problema è che ho eseguito git diff, quindi eseguito git reset --hard HEAD, quindi realizzato che volevo annullare, quindi ho provato a copiare l'output da git diffun file e a utilizzarlo git apply, ma ho ricevuto un errore che "patch non si applica". Dopo essere passato a patche aver provato a usarlo, mi sono reso conto che una parte del diff è stata ripetuta per qualche motivo, e dopo aver rimosso il duplicato , patch(e presumibilmente anche git apply) ha funzionato.

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.