Come posso applicare una patch diff su Windows?


136

Ci sono molti programmi là fuori che possono creare una patch diff, ma ho un sacco di tempo cercando di applicarne uno. Sto cercando di distribuire una patch e ho ricevuto una domanda da un utente su come applicarla. Così ho provato a capirlo da solo e ho scoperto che non ne avevo idea, e la maggior parte degli strumenti che posso trovare sono da riga di comando. (Sono in grado di gestire una riga di comando, ma molte persone sarebbero perse senza una GUI simpatica e amichevole. Quindi quelli non vanno bene per questo scopo.)

Ho provato ad usare TortoiseSVN. Ho la patch che vorrei applicare. Faccio clic con il pulsante destro del mouse sulla patch e nel sottomenu TortoiseSVN è presente un'opzione che dice "Applica patch". Tutto ciò che fa è aprire una finestra vuota.

Quindi ho provato a colpire Open. Ha due opzioni: unisci e applica diff unificato. (La patch è in formato diff unificato, per fortuna.) Ma l'opzione di applicazione semplicemente non funziona: richiede la patch e una cartella. In qualche modo ha dimenticato di chiedere il file a cui applicare la patch! Quindi TortoiseSVN semplicemente non funziona. Esiste un'utilità basata su GUI di Windows che prenderà una patch e un file e lo applicherà correttamente?

EDIT: guardando le risposte finora, sembra che Tortoise lo farà bene solo se si tratta di un file che è già stato aggiornato. Questo non è il caso qui. Devo essere in grado di applicare una patch a un file che non è uscito da un repository SVN. Ho appena provato a usare Tortoise, perché mi capita di sapere che SVN usa diff e deve sapere come crearli e applicarli.


La risposta di WinMerge suonava bene, ma spiega solo come creare una patch, non come applicarla. TortoiseHG ha un ottimo modo per applicare le patch, ma per quanto ne so solo ai file che si trovano in un repository hg. Se il TortoiseDiff esterno SVN non può farlo, mi chiedo se uno strumento GUI può farlo.
Warren P,

3
Wow, hai ragione la risposta breve è ancora no - almeno in WinMerge. Richiesta di funzionalità su WinMerge qui sourceforge.net/tracker/…
KCD

Risposte:


32

Applica patch

Con TortoiseMerge:

  1. Trova e apri una directory repository SVN esistente
  2. Creare una nuova directory denominata "unisce", se non esiste già
  3. Copia il file su cui desideri applicare il file .patch
  4. AGGIUNGI e COMMIT nel repository svn prima di continuare con il passaggio successivo
  5. Fai clic con il pulsante destro del mouse su fusioni e scegli Applica patch ...
  6. Fare doppio clic sul file dall'elenco
  7. Il file con patch con diff viene visualizzato nel riquadro di destra
  8. Fai clic su quel riquadro e premi Salva o esporta con File-> Salva con nome ...

Screeny alternativo se apri da TortoiseMerge. Nella schermata seguente, la directory fa riferimento alla directory "Unisci" menzionata al passaggio 2 sopra: Screeny

Schermata della GUI di WinMerge: Screeny


@WarrenP: sì, spiega come applicare la patch usando TortoiseMerge
Walter Stabosz,

4
Il mio commento aveva senso prima delle modifiche e non ha più senso dopo le modifiche. Sei ancora confuso? Il timestamp di modifica sopra (24 marzo '11) sembra essere errato, dal momento che l'OP ha modificato di nuovo la sua risposta dall'ottobre 2011. Penso che anche il timestamp sul mio commento sia sbagliato.
Warren P,

9
@SheriffMd Non viene visualizzato l'errore "D: \ La cartella non è una copia funzionante"?
onmyway133,

1
@SheriffMd Ricevo anche il messaggio "cartella ... non è una copia funzionante" - quindi, come è possibile utilizzare la fusione tartaruga per applicare una patch a un file senza versione?
Peter T.

1
@ onmyway133, ho riformulato i passaggi. Consultare il passaggio 2 e il passaggio 4. Non verrà visualizzato il messaggio di errore "copia non funzionante".
Sceriffo Md

21

Ho creato lo strumento Python puro solo per quello. Ha un comportamento prevedibile multipiattaforma. Sebbene non crei nuovi file (al momento della stesura di questo) e manchi di una GUI, può essere usato come libreria per creare strumenti grafici.

AGGIORNAMENTO : Dovrebbe essere più comodo usarlo se hai installato Python.

pip install patch
python -m patch

1
Lo uso molto. Grazie @techtonik. Qualche novità su come farlo funzionare con Python3?
pelson,

Esegui la patch di installazione pip con i diritti di amministrazione per essere sicuro che funzioni.
Vertexwahn,

@Vertexwahn è su Linux?
Anatoly Techtonik,

Python funziona ovunque - l'ho provato con Windows 10
Vertexwahn

Funzionava su Windows 10 quando la patch git non funzionava. Grazie!
sqrl0

19

TortoiseMerge è un'utilità separata fornita in bundle con TortoiseSVN.

Può anche essere scaricato separatamente nell'archivio TortoiseDiff.zip . Ciò ti consentirà di applicare differenze unificate ai file senza versione.


21
AFAIK, questo non può applicare patch su un file senza versione.
pihentagy,

Non ho avuto problemi ad applicarlo a un file senza versione.
Paul Shannon,

altri vogliono: S.
UmNyobe,

1
La versione 1.8.7 fornisce un errore relativo al fatto che dest non è stato aggiornato.
Nick Westgate,

15

So che hai detto che preferiresti una GUI, ma gli strumenti a riga di comando funzioneranno bene. Vedi GnuWin per una porta di strumenti unix per Windows. Avresti bisogno del comando patch, ovviamente ;-)

Tuttavia, potresti riscontrare un problema con la terminazione della linea. La porta GnuWin supporrà che il file di patch abbia una terminazione di linea in stile DOS (CR / LF). Prova ad aprire il file di patch in un editor ragionevolmente intelligente e lo convertirà per te.


Ben messo. Non sarei stato in grado di capire il problema di terminazione della linea senza questo commento.
Bryan,

Un altro modo per gestire le terminazioni di riga è aggiungere l'opzione "--binary" alla riga di comando.
BeReal82

4
Questo è ciò che mi ha portato sulla strada giusta. Tuttavia, con Windows 7 o versioni successive è necessario aggiornare il file manifest di patch.exe per evitare che venga visualizzato il controllo dell'account utente ogni volta. Vedi questa pagina per un how-to: math.nist.gov/oommf/software-patchsets/patch_on_Windows7.html
Anttu,

1
Anche con le correzioni UAC, la versione GnuWin della patch confonde le impostazioni di sicurezza dei file. La build fornita con git non presenta alcun problema.
Artfunkel

8

In TortoiseSVN, l'applicazione della patch funziona. È necessario applicare la patch alla stessa directory da cui è stata creata . È sempre importante tenerlo presente. Quindi, ecco come lo fai in TortoiseSVN:

Fare clic con il tasto destro sulla cartella a cui si desidera applicare la patch. Presenterà una finestra di dialogo che chiede la posizione del file patch. Seleziona il file e questo dovrebbe aprire una piccola finestra con l'elenco dei file che elenca i file modificati e facendo clic su ogni elemento dovrebbe aprire una finestra diff che mostra cosa sta per fare la patch per quel file.

In bocca al lupo.


8
Questo non aiuta. I file di destinazione non sono usciti da un archivio SVN. (Vedi la modifica al post originale.)
Mason Wheeler,

8

L'utilità patch.exe dall'installazione di Git funziona su Windows 10.

Installa Git per Windows, quindi usa il "C:\Program Files\Git\usr\bin\patch.exe"comando per applicare una patch.

Se Hunk #1 FAILED at 1 (different line endings).durante l'applicazione di una patch è stato visualizzato un messaggio di errore simile a un durante l'output, provare ad aggiungere -l(ovvero una scorciatoia per --ignore-whitespace) o le --binaryopzioni alla riga di comando.


Questa domanda riguarda principalmente uno strumento GUI per utenti occasionali che non hanno familiarità con i tipici strumenti da riga di comando. La tua risposta sarebbe più utile se almeno fornissi alcuni comandi di esempio completi come esempio.
Álvaro González,

Funziona con il compositore in Windows 10.
ecdani,

7

Puoi usare questo porta nativa Win32 dell'utilità patch.

Viene fornito con una più ampia selezione di altre utility e, al contrario di Cygwin e simili, non ha bisogno di DLL o simili. Scegli il tuo piccolo eseguibile di tua scelta e conservalo dove vuoi.

Semplice utilizzo:

patch.exe -i <patchfile>

Chiedi altro aiuto:

patch.exe --help

4
Ho problemi con questo su Windows 7: apre una nuova finestra CMD e richiede i privilegi di amministratore quando tento di eseguire patch.exe.
Roy Tinker,

3
L'eseguibile della patch si trova anche nel bundle Git per Windows.
Snicksie,

6
Se riscontri problemi con patch.exe, puoi rinominarlo in qualsiasi cosa non includa patch. Windows considera patchsospetti tutti gli ex con la parola .
wbond

2

EDIT: guardando le risposte finora, sembra che Tortoise lo farà bene solo se si tratta di un file che è già stato aggiornato. Questo non è il caso qui. Devo essere in grado di applicare una patch a un file che non è uscito da un repository SVN. Ho appena provato a usare Tortoise perché mi capita di sapere che SVN usa i diff e deve sapere come crearli e applicarli.

È possibile installare Cygwin , quindi utilizzare lo strumento patch della riga di comando per applicare la patch. Vedi anche questa pagina man di Unix , che si applica alla patch .


4
Sì, potrei. Ho Cygwin, in effetti. Probabilmente potrei anche far funzionare la tua soluzione. Tuttavia, non lo farò passare ai miei utenti. Hai idea di quanti utenti Windows in questi giorni non sappiano nemmeno cosa sia una riga di comando? : P
Mason Wheeler,

2

Sembra che TortoiseSVN (TortoiseMerge) richieda la lineaIndex: foobar.py nel file diff / patch. Questo è quello che dovevo fare per far funzionare un file patch non TortoiseSVN con il comando Applica patch di TortoiseSVN con il tasto destro .

Prima:

--- foobar.py.org   Sat May 08 16:00:56 2010
+++ foobar.py   Sat May 08 15:47:48 2010

Dopo:

Index: foobar.py
===================================================================
--- foobar.py
+++ foobar.py   (working copy)

O se conosci la revisione specifica da cui il tuo collaboratore stava lavorando:

Index: foobar.py
===================================================================
--- foobar.py   (revision 1157)
+++ foobar.py   (working copy)

2

Uso MSYS2 da http://www.msys2.org/

Esso fornisce molti programmi di utilità come patch, which, git, tree, e molti altri.

Dopo aver installato MSYS2, esegui semplicemente il gestore pacchetti per installare patch:

pacman -S patch

Questo è solo un modo contorto per installare uno strumento da riga di comando. Sospetto che tu abbia letto solo il titolo della domanda e non la domanda stessa. :)
Álvaro González,

1

La patch indica a quale file applicare. L'intestazione dovrebbe essere qualcosa del genere (visualizzalo in Blocco note o nel tuo editor di testo preferito):

--- Folder/old_file
+++ Folder/new_file

Nel caso di una patch Subversion, avresti anche i numeri di revisione (poiché i nomi dei file sono gli stessi).

La patch GNU ti permetterà di sovrascrivere quei nomi, ma non conosco nessuno degli strumenti della GUI per fare lo stesso. Verificherei con i vari programmi diff - tuttavia, non sembra che WinMerge supporti l'applicazione di patch.


No, non c'è niente del genere nella parte superiore della mia patch. Stai dicendo che il nome file e il percorso devono essere inclusi nel diff stesso? Chi l'ha pensato? Cosa dovresti fare se vuoi distribuire un diff a qualcuno che potrebbe avere cose installate in altre cartelle?!?
Mason Wheeler,

La parte superiore della patch inizia in questo modo: --- / +++ / @@ -6,12 +6,12 @@ Nessun nome file o altro. Come dovrebbe funzionare un percorso integrato? Cosa succede se ho creato la patch su XP e qualcuno sta cercando di usarla su Vista (o viceversa) e il percorso della cartella Documenti è diverso?
Mason Wheeler,

1
I nomi dei file sono relativi alla directory principale del repository, quindi le differenze nella struttura delle cartelle di XP / Vista non contano. E la ragione per avere nomi di file nella patch è che la maggior parte delle patch influisce su più file.
David Z,

Vedo. OK, ha più senso. Grazie per averlo chiarito, David!
Mason Wheeler,

1

Eclipse dovrebbe essere in grado di farlo, andare in prospettiva TeamSynchronize e quindi in Progetto-> Applica patch


1

Per i progetti Java, ho usato NetBeans per applicare i file patch. Se il codice Java da correggere non è già un progetto NetBeans, crearne uno. Per creare un nuovo progetto:

  • Selezionare il menu File -> Nuovo progetto
  • Nella finestra di dialogo risultante, rendilo un progetto Applicazione Java . Dagli un nome nella finestra di dialogo e fai clic Finish.
  • Fare clic con il tasto destro del mouse sul nome del progetto e selezionare Proprietà dal menu contestuale
  • Nella finestra di dialogo risultante, selezionare Sorgenti e aggiungere una cartella di origine . Cerca la tua fonte Java.

Ora che hai un progetto, applica la patch:

  • Evidenzia il tuo progetto per selezionarlo
  • Dal menu principale, selezionare il menu Strumenti -> Applica patch diff
  • Nella finestra di dialogo risultante, selezionare il file della patch, selezionarlo e premere il pulsante Patch.

Questo è tutto. La patch dovrebbe essere applicata e dovresti vedere una finestra diff che mostra le modifiche.


1

Sto già usando BeyondCompare (commerciale) per diff e fusioni e questo strumento ha anche la capacità di creare, visualizzare e applicare patch.


1

Se stai usando Mercurial , questo viene fatto tramite "import". Quindi alla riga di comando, ilhg import comando o (potresti trovare l' --no-commitopzione utile) o "Repository" => "Importa ..." in Hg Workbench.

Si noti che questi eseguiranno il commit delle modifiche per impostazione predefinita; puoi evitarlo usando l' hg import --no-commitopzione se usi la riga di comando o se hai usato Hg Workbench, potresti trovare utile rilasciare hg rollbackdopo l'unione.


Esattamente quello che stavo cercando! Mi chiedevo come evitare il commit.
Keshav,

0

Quando applico le patch usando TortoiseSVN, in genere salvo il percorso nella radice del repository estratto. Dovresti quindi essere in grado di fare clic con il pulsante destro del mouse sulla patch, andare al menu TortoiseSVN e fare clic su ApplyPatch. ApplyPatch dovrebbe capire automaticamente quale livello nella gerarchia di directory è stata creata la patch.

In passato, tuttavia, ho riscontrato problemi con l'applicazione di patch che contengono nuovi file o che comportano la ridenominazione di file. Qualunque sia l'algoritmo che Tortoise utilizza per questo, non sembra gestire molto bene quegli scenari. Unicode può darti problemi simili.


0

Hai due monitor? Stavo avendo lo stesso problema con TortoiseMerge e mi sono reso conto che quando ho disabilitato uno dei monitor si è mostrata la piccola finestra con l'elenco dei file. Spero che questo ti aiuti.


0

Se viene visualizzato il messaggio di errore "Copia non funzionante", provare a selezionare una directory dalla finestra di dialogo TortoiseMerge che è una directory di lavoro di SVN.


0

Una porta BusyBox per Windows ha sia un comando diff che patch, ma supporta solo il formato unificato.


0

Usa solo:

patch -p0 < path-file.patch

ricorda di eseguire questo comando solo dalla posizione della cartella in cui hai creato la patch.

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.