Diff a patch

K čemu diff a patch

  1. Potřebujete předat úpravu zdrojáků někomu (člověk, skupina, ..) a nechcete posílat celé zdrojáky.
  2. Potřebujete upravit svojí kopii zdrojových kódů pomocí získaného patche.

Základní znalosti

  • Soubor "neco.patch" uchovává rozdíl mezi dvěma soubory a je vytvořen programem 'diff'
  • 'patch' je program a 'diff' je program
  • Soubor typu "neco.patch" popřípadě "neco.diff" je výsledek používání programů 'diff' a může být využit programem 'patch'. Výsledek programu 'diff' může být však klidně uchován v souboru s jakoukoliv příponou (i prázdnou). Jde o plain text.
  • Program 'diff' zaznamenává rozdíly (read), 'patch' provádí změny podle rozdílů (write)
  • Program 'patch' vždy potřebuje výsledek programu 'diff'

Diff

  • Program 'diff' má parametry. Program nelze spustit bez parametru '-u' (unified diff). Pokud parametr '-u' nepoužijete, upadnou vám ruce a zezelenáte.
  • Docela dobrý nápad je používat parametr '-N' (viz man diff).
  • Syntaxe je 'diff stary novy'.
  • Většinou chceme pomocí přesměrování výstupu uložit výsledek do souboru (vytvoření patche)
    diff -uN stary.c novy.c > muj.patch
  • Někdy chceme zaznamenat do patche rozdíl celé stromové struktury. Mějme adresář 'src/', který obsahuje zdrojové kódy.
    mv src oldsrc #oznacime si puvodni zdrojaky jako stare
    cp -r oldsrc newsrc #zkopirujeme si puvodni zdrojaky jako novy strom
    cd newsrc
    # tady programujeme jako silenci
    cd .. #skoncili jsme s nasi upravou, mame newsrc/ a oldsrc/
    
    diff -rupN oldsrc/ newsrc/ > complete.patch
    

    Kde '-r' znamená rekurzivně (projde celý strom), '-u' je unified diff, '-N' je zacházení neexistujícími soubory, '-p' zvyšuje přehlednost při čtení patche člověkem.

Patch

Pro změnu jednoho souboru pomocí patche, lze použít:

patch < newmainc.patch

To změní soubor uvedený uvnitř patche. Očekává se unifikovaný patch (diff). Pokud není unifikovaný, je potřeba specifikovat soubor, který se má měnit

patch main.c < newmainc.patch

Ukázka

$ basename $PWD
src
$ cat main.c
int main(int argc, char *argv[])
{
        return (0);
}
 
$ cd ../
$ ls
newsrc/  src/
$ diff -uN src/main.c newsrc/main.c 
--- src/main.c  2008-12-25 16:20:52.000000000 +0100
+++ newsrc/main.c       2008-12-25 16:18:13.000000000 +0100
@@ -1,5 +1,6 @@
 int main(int argc, char *argv[])
 {
-        return (0);
+       int i = (int) sizeof(void *);
+       return (i*8);
 }
 
$ diff -uN src/main.c newsrc/main.c > newmainc.patch
$ cd src/
$ patch < ../newmainc.patch
patching file main.c
$ ls
main.c
$ cat main.c 
int main(int argc, char *argv[])
{
        int i = (int) sizeof(void *);
        return (i*8);
}
 
$

Tipy

Porovnání hudby

$ cd hudba
$ ls
Beatles/ Beatles2/
$ ls Beatles | wc -l; ls Beatles2 | wc -l 
8923
8923
$ # pocet polozek v adresarich je stejny
$ ls Beatles > /tmp/1; ls Beatles2 > /tmp/2; diff /tmp/1 /tmp/2
$ # vsechny polozky jsou v obou adresarich
$ du -sh Beatles Beatles2
892T    Beatles/
39E     Beatles2/
$ # tady je uz konecne nejaky rozdil

Barevný diff

Nehodí se pro použití s programem patch, ale má hezký barevný výstup.

colordiff old new

Binární diff

Hodí se pro diffování binárních souborů (například binárek programů, knihoven…)

Příklad: Vytvoření binárního patche otagované hudby

bspatch neotagovane.mp3 otagovane.mp3 patch.bsdiff
bspatch neotagovane.mp3 nove_otagovane.mp3 patch.bsdiff
/home/dum8d0g/www/martin.kopta.eu/trash/wiki/data/pages/software/diff_a_patch.txt · Poslední úprava: 2010/05/01 10:31 autor: martin
CC Attribution 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0