Réponses:
La façon la plus courante de créer un correctif consiste à exécuter la diff
commande ou une commande diff
similaire à un contrôle de version . Parfois, vous comparez simplement deux fichiers et vous exécutez diff
comme ceci:
diff -u version_by_alice.txt version_by_bob.txt >alice_to_bob.patch
Ensuite, vous obtenez un correctif qui contient des modifications pour un fichier et ne contient aucun nom de fichier. Lorsque vous appliquez ce correctif, vous devez spécifier le fichier auquel vous souhaitez l'appliquer:
patch <alice_to_bob.patch version2_by_alice.txt
Souvent, vous comparez deux versions d'un projet multi-fichiers entier contenu dans un répertoire. Une invocation typique de diff
ressemble à ceci:
diff -ru old_version new_version >some.patch
Ensuite, le patch contient des noms de fichiers, donnés dans des lignes d'en-tête comme diff -ru old_version/dir/file new_version/dir/file
. Vous devez indiquer patch
de supprimer le préfixe ( old_version
ou new_version
) du nom de fichier. C'est ce qui -p1
signifie: supprimer un niveau de répertoire.
Parfois, les lignes d'en-tête du patch contiennent directement le nom du fichier sans plomb. Ceci est courant avec les systèmes de contrôle de version; par exemple, cvs diff
produit des lignes d'en-tête qui ressemblent diff -r1.42 foo
. Ensuite, il n'y a pas de préfixe à supprimer, vous devez donc le spécifier -p0
.
Dans le cas particulier où il n'y a pas de sous-répertoires dans les arbres que vous comparez, aucune -p
option n'est nécessaire: patch
supprimera toute la partie répertoire des noms de fichiers. Mais la plupart du temps, vous avez besoin de l'un -p0
ou l' autre -p1
, selon la façon dont le patch a été produit.
diff old/foo new/foo >my.patch
ou diff ../old/foo foo >my.patch
ou diff foo.old foo >my.patch
et que l'utilisateur pouvait l'appliquer patch <my.patch
sans avoir à se soucier de la façon dont le correctif avait été produit, puis a -p
été ajouté pour plus de commodité. Mais je ne sais pas vraiment, patch
c'est un ancien utilitaire et au moment où j'ai commencé à l'utiliser -p0
ou j'étais -p1
déjà le moyen le plus courant de l'utiliser.
De l'homme:
-pnum
ou--strip=num
Supprimez le plus petit préfixe contenant des barres obliques num de chaque nom de fichier trouvé dans le fichier correctif. Une séquence d'une ou plusieurs barres obliques adjacentes est comptée comme une seule barre oblique. Cela contrôle la façon dont les noms de fichiers trouvés dans le fichier de correctif sont traités, au cas où vous conservez vos fichiers dans un répertoire différent de celui qui a envoyé le correctif. Par exemple, en supposant que le nom de fichier dans le fichier correctif était:/u/howard/src/blurfl/blurfl.c
paramètre
-p0
donne le nom de fichier entier non modifié ,-p1
donneu/howard/src/blurfl/blurfl.c
sans barre oblique ,
-p4
donneblurfl/blurfl.c
La différence est que le nombre après -p
spécifierait le nombre de composants de chemin qui seraient supprimés.
Disons que nous avons un chemin /Barack/Obama
. Exécuter un patch dessus avec l' -p0
argument traitera le chemin tel quel :
/Barack/Obama
Mais nous pouvons couper le chemin tout en corrigeant:
-p1
supprimera la barre oblique racine (notez que ce sera juste Barack maintenant, sans une barre oblique):
Barack/Obama
-p2
supprimera Barack (et la barre oblique droite adjacente):
Obama
Pour développer le «pourquoi» de ce patch
comportement, lisez ce fil .