Seconda situazione: hai scaricato i sorgenti di un pacchetto open source e dopo un'oretta di piccoli cambiamenti, riesci a compilarlo sul tuo sistema. Vorresti rendere il tuo lavoro disponibile agli altri programmatori, oppure agli autori del pacchetto, senza dover ridistribuire tutto quanto il pacchetto modificato. Ti trovi quindi in una situazione in cui devi creare da te una patch, e lo strumento necessario è diff.
Questa è una breve guida a diff e patch, che ti aiuterà in queste situazioni descrivendo questi strumenti e come vengono utilizzati nella maniera più comune. Ti dirà abbastanza per cominciare ad utilizzarli subito. Dopo, potrai imparare da te i vari comandi aggiuntivi per il tuo piacere personale, utilizzando le pagine del manuale.
Applicare una patch con patch
Per applicare una patch ad un singolo file, spostati nella cartella dove è situato il file ed invoca patch:patch < foo.patch
Queste istruzioni assumono che la patch sia distribuita in un formato unificato, che identifica il file al quale si deve applicare la patch. Se non è questo il caso, si può specificare il file da riga di comando:
patch foo.txt < bar.patch
Applicare delle patch ad intere cartelle (forse il caso più comune) è simile, ma si deve fare attenzione a specificare un "livello p". Questo vuol dire che, all'interno dei file di patch, i file cui applicare la patch sono identificati da percorsi che possono essere diversi ora che i file sono situati sul tuo computer, piuttosto che su quello in cui la patch è stata creata. Il livello p dice a patch di ignorare porzioni del percorso ai file, così da poterli identificare in maniera corretta. Nella maggior parte dei casi un livello p corrispondente a uno funziona, quindi si può usare:
patch -p1 < baz.patch
Ti dovresti spostare nella cartella principale dei sorgenti prima di lanciare questo comando. Se il livello uno non identifica correttamente nessun file cui applicare la patch, verifica il contenuto del file di patch per controllare i nomi dei file. Se trovi un nome del tipo:
/users/stephen/package/src/net/http.c
e stai lavorando nella cartella che contiene net/http.c, usa:
patch -p5 < baz.patch
In generale, aggiungi uno per ciascun separatore di cartella (la barra '/') che vuoi rimuovere dall'inizio del percorso, fino a che quello che resta è un percorso che esiste nella tua cartella di lavoro. Il valore che raggiungi, è il corrello livello p.
Per rimuovere una patch, utilizza il flag -R, ad esempio:
patch -p5 -R < baz.patch
Creare delle patch con diff
Utilizzare diff è molto semplice, sia che si stia lavorando con singoli file, sia che si stia lavorando su intere cartelle. Per creare una patch per un solo file, usa la forma:
diff -u original.c new.c > original.patch
cp -R original new
Applica tutte le modifiche che intendi fare nella cartella new/. Dopo crea un file di patch con il seguente comando:
diff -rupN original/ new/ > original.patch
Questo è tutto quello che serve per incominciare ad usare diff e patch. Per altre informazioni, puoi sempre usare:
man diff
man patch
Freely translated from this original post, for my own convenience.
Post interessante! Vorrei chiedere un particolare non trattato, e che faccio fatica a trovare in rete.
ReplyDeleteSe per esempio, apporto delle mie modifiche al codice di wordpress per adattarlo alle mie esigenze, al prossimo aggiornamento di wordpress le modifiche verranno sovrascritte.
Se io dovessi creare una patch col tool diff, e poi applicarla ai sorgenti della nuova versione di wordpress... funzionerebbe? Non è che, trattandosi di una versione nuova, quindi già diversa da quella di partenza da cui ho creato la patch, ci siano "incompatibilità" per cui non è applicabile la patch?
In generale, come è possibile gestire queste situazioni, in modo automatico o con qualche tool che semplifichi la vita? Senza dover riapportare a mano, ogni volta, tutte le varie modifiche...
Grazie :)
Il problema di cui parli è noto e non banale, si tratta del "merge di revisioni differenti". Non c'è una tecnica automatizzata per farlo, proprio perché come dici tu la versione cui si riferisce la patch che hai potrebbe essere "incompatibile" con quella che hai tu...
DeleteDi solito il problema si risolve più o meno a mano, prendendo la patch ed applicandola alla versione corretta cui si riferisce, in una cartella x. In una cartella y si scarica la versione nuova, e poi si utilizzano dei tool, grafici o meno, (ad esempio io utilizzo meld, http://meldmerge.org/ ) che ti permettono di mettere insieme i pezzi dalle diverse versioni, file per file, cercando le differenze in tutti i file di tutte le sottocartelle di x ed y.
Spero che sia d'aiuto! :)
This comment has been removed by the author.
ReplyDeletethe 1 best anime-manga 2019
ReplyDeletehttps://grahamrutland.blogspot.com/2019/10/babylon.html
https://grahamrutland.blogspot.com/2019/10/watashi-nouryoku-wa-heikinchi-de-tte.html
https://grahamrutland.blogspot.com/2019/10/stand-my-heroes-piece-of-truth.html
https://grahamrutland.blogspot.com/2019/10/phantasy-star-online-2-episode-oracle.html
https://grahamrutland.blogspot.com/2019/10/zx-code-reunion.html
https://grahamrutland.blogspot.com/2019/10/kandagawa-jet-girls.html
KBC is india's Most awaiting TV Show to give you chance to win bumper cash prizes in KBC Show, Register in KBC and Win extra cash to change your fate. Its all about KBC.
ReplyDeleteKBC Lottery Winner
KBC Lottery Winner 2020
KBC Winner List
KBC Winner List 2020
KBC Winner
KBC Winner 2020
kbc Lottery Winner 2020 List Today
The blog you shared is awesome.
ReplyDeleteAngularJS training in chennai | AngularJS training in anna nagar | AngularJS training in omr | AngularJS training in porur | AngularJS training in tambaram | AngularJS training in velachery