Quelle est la différence entre patch -p0
et patch -p1
?
Y a-t-il une différence?
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
oudiff ../old/foo foo >my.patch
oudiff foo.old foo >my.patch
et que l'utilisateur pouvait l'appliquerpatch <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:
la source
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 :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):-p2
supprimera Barack (et la barre oblique droite adjacente):Pour développer le «pourquoi» de ce
patch
comportement, lisez ce fil .la source