2009-02-05 22 views
122

Ci sono un sacco di programmi là fuori che possono creare una patch di diff, ma ho un bel pò 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 cercato di capirlo da solo e ho scoperto che non ne ho idea, e la maggior parte degli strumenti che riesco a trovare sono a riga di comando. (Posso gestire una riga di comando, ma molte persone andrebbero perse senza una GUI piacevole.)Come si applica una patch diff su Windows?

Ho provato a usare TortoiseSVN. Ho la patch che vorrei applicare. Ho fatto clic con il pulsante destro sulla patch e c'è un'opzione sotto il sottomenu TortoiseSVN che dice "Applica patch". Tutto ciò che fa è tirare su una finestra vuota.

Così ho provato a colpire Apri. Ha due opzioni: unire e applicare diff unificato. (La patch è in un formato diff unificato, per fortuna.) Ma l'opzione apply semplicemente non funziona: richiede la patch e una cartella. In qualche modo si è dimenticato di chiedere il file per applicare la patch! Quindi TortoiseSVN semplicemente non funziona. Esiste una utility basata su GUI di Windows che prenderà una patch e un file e la applicherà correttamente?

MODIFICA: guardando le risposte finora, sembra che Tortoise lo farà solo se è un file che è già in versione. 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é capisco che SVN usa diff e deve sapere come crearli e applicarli.

+0

La risposta di WinMerge sembrava buona ma spiega solo come creare una patch, non come applicarla.TortoiseHG ha un ottimo modo per applicare le patch, ma solo per i file che sono in un repository hg, per quanto ne so. Se il TortoiseDiff esterno SVN non può farlo, mi chiedo se uno strumento GUI può. –

+2

Wow, hai ragione la risposta breve è ancora no - almeno in WinMerge. Richiesta di funzionalità su WinMerge qui https://sourceforge.net/tracker/index.php?func=detail&aid=695741&group_id=13216&atid=363216 – KCD

risposta

8

In TortoiseSVN, l'applicazione di patch funziona. È necessario applicare la patch nella stessa directory in cui era creata da. È sempre importante tenerlo a mente. Ecco come si fa in TortoiseSVN:

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

Buona fortuna.

+7

Ciò non aiuta. I file di destinazione non sono usciti da un archivio SVN. (Vedi la modifica al post originale.) –

0

Quando si applicano patch con TortoiseSVN, in genere si salva il percorso nella directory principale del repository estratto. Dovresti quindi fare clic con il tasto destro sulla patch, andare al menu TortoiseSVN e fare clic su ApplyPatch. ApplyPatch dovrebbe determinare automaticamente il livello nella gerarchia di directory creata per la patch.

Ho, tuttavia, avuto problemi in passato con l'applicazione di patch che contengono nuovi file o che comportano la ridenominazione di file. Qualunque algoritmo usi da Tortoise per questo non sembra gestire questi scenari molto bene. Unicode può darti problemi simili.

1

La patch indica quale file applicare. L'intestazione dovrebbe essere qualcosa di simile (visualizzarlo in Blocco note o un editor di testo preferito in California):

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

Nel caso di una patch Subversion, devi avere i numeri di revisione, nonché (dal momento che i nomi dei file sono gli stessi) .

GNU patch ti consente di sostituire questi nomi, ma non conosco alcuno strumento della GUI per fare lo stesso. Verificherò con i vari programmi diff, anche se non sembra che WinMerge supporti l'applicazione delle patch.

+0

No, non c'è niente di simile 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 aver installato cose in altre cartelle?!? –

+0

La parte superiore della patch inizia così: ---/+++/@@ -6,12 +6,12 @@ Nessun nome file o altro. Come si suppone che un percorso integrato funzioni? Cosa succede se ho creato la patch su XP e qualcuno sta cercando di usarlo su Vista (o viceversa) e il percorso della cartella Documenti è diverso? –

+1

I nomi file sono relativi alla directory principale del repository, quindi le differenze nella struttura delle cartelle XP/Vista non sono importanti. E la ragione per avere nomi di file nella patch è che la maggior parte delle patch riguarda più file. –

3

MODIFICA: esaminando le risposte fino ad ora, sembra che Tortoise lo esegua correttamente solo se si tratta di un file già in versione. 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é so che SVN usa diff e deve sapere come crearli e applicarli.

È possibile installare Cygwin, quindi utilizzare la linea di comando cerotto strumento per applicare la patch. Vedi anche this Unix man page, che si applica alla patch .

+4

Sì, potrei. Ho Cygwin, infatti. Probabilmente potrei far funzionare anche la tua soluzione. Però non metterò i miei utenti in questo modo. Hai idea di quanti utenti di Windows in questi giorni non sappiano nemmeno cos'è una riga di comando? : P –

+0

Hai un punto lì ... –

15

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

Tuttavia, potresti avere un problema con la terminazione della linea. La porta GnuWin assumerà 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.

+0

Questo ha funzionato per me :), evviva! –

+0

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

+0

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

2

Sembra che TortoiseSVN (TortoiseMerge) requires the line Index: foobar.py nel file diff/patch. Questo è quello che dovevo fare per far funzionare un file di patch non TortoiseSVN con il tasto destro del mouse di TortoiseSVN. Applica il comando Patch.

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) 

Oppure, se si conosce la revisione relative al Suo collaboratore stava lavorando da:

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

TortoiseMerge è un programma separato fornito in dotazione con TortoiseSVN.

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

+21

AFAIK questo non può applicare patch su un file non in versione. – pihentagy

+0

Non ho avuto problemi ad applicarlo a un file non in versione. –

+0

altri vogliono: S. – UmNyobe

29

applicare la patch

Con TortoiseMerge:

  1. trovare e aprire una directory esistente repo SVN
  2. creare una nuova directory denominata "fonde", se non esiste già
  3. Copia il file su cui vuoi applicare il file .patch
  4. AGGIUNGI e COMMIT alla svn rep ository prima di continuare con il passaggio successivo
  5. Fare clic con il tasto destro del mouse su Fonde e scegliere Applica patch ...
  6. doppio clic sul file dalla lista
  7. Il file patchato con diff viene visualizzata nel riquadro di destra
  8. cliccare su quel pannello e colpire Salva o di esportazione con File-> Salva con nome ...

Alternativey Screeny se apri da TortoiseMerge. Nel screeny di seguito, la directory si riferisce alla directory "unioni" di cui al precedente punto 2: Screeny

Schermata di WinMerge GUI: Screeny

+0

@WarrenP: sì, spiega come applicare la patch utilizzando TortoiseMerge –

+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 non essere corretto, poiché l'OP ha modificato la sua risposta di nuovo da ottobre 2011. Penso che anche il timestamp sul mio commento sia sbagliato. –

+9

@SheriffMd Non si riceve l'errore "D: \ Folder is not a working copy"? – onmyway133

0

Avete due monitor? Avevo lo stesso problema con TortoiseMerge e mi sono reso conto che quando disabilitavo uno dei monitor appariva la piccola finestra con la lista dei file. Spero che questo ti aiuti.

15

Ho fatto pure Python tool solo per quello. Ha un comportamento prevedibile su più piattaforme. Sebbene non crei nuovi file (al momento della stesura di questo) e manchi di una GUI, può essere usato come libreria per creare uno strumento grafico.

UPDATE: Dovrebbe essere più comodo usarlo se avete installato Python.

pip install patch 
python -m patch 
+1

Lo uso molto. Grazie a @techtonik. Qualche notizia su come farlo funzionare con Python3? – pelson

+0

@pelson 1.16+ dovrebbe funzionare su Python 3 ora. –

+0

Eseguire la patch di installazione del pip con i diritti di amministrazione per accertarsi che funzioni. – Vertexwahn

7

È possibile utilizzare this Win32 porta nativa del programma di utilità patch.

Arriva con una selezione più ampia di altre utilità e, al contrario di Cygwin e simili, non ha bisogno di DLL o simili. Scegli il tuo piccolo eseguibile di scelta e memorizzalo dove vuoi.

utilizzo semplice:

patch.exe -i <patchfile> 

Più aiuto:

patch.exe --help 
+4

Ho problemi con questo su Windows 7: apre una nuova finestra CMD e richiede i privilegi amministrativi quando tento di eseguire 'patch.exe'. –

+2

L'eseguibile della patch può anche essere trovato nel pacchetto Git per Windows. – Snicksie

+5

Se si verificano problemi durante l'esecuzione di patch.exe, è possibile rinominarlo con qualsiasi cosa che non include 'patch'. Windows considera sospetti tutti gli ex con la parola 'patch'. – wbond

1

Se si utilizza Mercurial, questo viene fatto tramite "importazione". Quindi, alla riga di comando, il comando hg import o (potresti trovare utile l'opzione --no-commit) o "Repository" => "Importa ..." in Hg Workbench.

Si noti che questi importeranno le modifiche di default; puoi evitarlo usando l'opzione hg import --no-commit se usi la riga di comando, o se hai usato Hg Workbench, potresti trovare utile emettere hg rollback dopo l'unione.

+0

Esattamente quello che stavo cercando! Mi stavo chiedendo come evitare il commit. – Keshav

1

Eclipse dovrebbe essere in grado di farlo, andare a TeamSynchronize prospettiva e poi in Progetto-> Applicare la patch

0

Se hai trovato "Non è una copia di lavoro" messaggio di errore quindi provare la selezione di una directory dalla finestra di dialogo che TortoiseMerge è una directory di lavoro di SVN.

1

Per i progetti Java, ho utilizzato NetBeans per applicare i file di correzione. Se il codice Java che si sta applicando non è già un progetto NetBeans, creare un progetto per esso.Per creare un nuovo progetto:

  • Selezionare il menu File ->Nuovo progetto
  • Nella finestra di dialogo risultante, ne fanno un progetto Java Application. Assegnare un nome nella finestra di dialogo e fare clic su Fine.
  • destro del mouse sul nome del progetto, e selezionare Proprietà dal menu contestuale
  • Nella finestra di dialogo visualizzata, selezionare Fonti, e aggiunge una cartella di origine . Sfoglia la tua sorgente Java.

Ora che hai un progetto, applicare la patch:

  • Evidenziare il progetto per selezionarlo
  • Dal menu principale, selezionare il menu Strumenti ->Applicare Diff Patch
  • Nella finestra di dialogo visualizzata, cercare il file di patch, selezionarlo e premere il pulsante Patch.

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

0

A porta BusyBox per Windows ha sia un comando diff e patch, ma supportano solo il formato unificato.

0

Sto già utilizzando BeyondCompare (commerciale) per diff e unioni, e questo strumento anche has the capability per creare, visualizzare e applicare patch.

2

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

Installare Git for Windows quindi utilizzare il comando "C:\Program Files\Git\usr\bin\patch.exe" applicare una patch.

Se un messaggio di errore come un Hunk #1 FAILED at 1 (different line endings). era stato ottenuto in uscita durante l'applicazione di una patch, provare ad aggiungere le -l (che è una scorciatoia per la --ignore-whitespace) o il --binary passa alla riga di comando.

+0

Questa domanda riguarda principalmente uno strumento GUI per utenti occasionali che non hanno familiarità con gli strumenti tipici della riga di comando. La tua risposta sarebbe più utile se fornisci almeno alcuni esempi completi di comandi come esempio. –

0

Io uso MSYS2 da http://www.msys2.org/

Esso fornisce molte utility come patch, which, git, tree, e molti altri.

Dopo aver installato MSYS2 semplicemente eseguire il gestore di pacchetti da installare patch:

pacman -S patch 
+0

Questo è solo un modo complesso per installare uno strumento da riga di comando. Sospetto che tu abbia letto solo il titolo della domanda e non la domanda stessa. :) –

0

Basta usare:

patch -p0 < path-file.patch 

ricordare eseguire questo comando solo dalla cartella in cui è stato creato il cerotto.

Problemi correlati