Lors du patch, quelle est la différence entre les arguments -p0 et -p1?

19

Quelle est la différence entre patch -p0et patch -p1?

Y a-t-il une différence?

chrisjlee
la source

Réponses:

23

La façon la plus courante de créer un correctif consiste à exécuter la diffcommande ou une commande diffsimilaire à un contrôle de version . Parfois, vous comparez simplement deux fichiers et vous exécutez diffcomme 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 diffressemble à 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 patchde supprimer le préfixe ( old_versionou new_version) du nom de fichier. C'est ce qui -p1signifie: 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 diffproduit 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 -poption n'est nécessaire: patchsupprimera toute la partie répertoire des noms de fichiers. Mais la plupart du temps, vous avez besoin de l'un -p0ou l' autre -p1, selon la façon dont le patch a été produit.

Gilles 'SO- arrête d'être méchant'
la source
Cela m'embrouille depuis si longtemps. Pourquoi le comportement d'aucun sous-répertoire n'est-il différent de -p0? J'ai toujours supposé que -p0 était par défaut, donc j'ai toujours eu des problèmes si c'était censé être p0
Brydon Gibson
@BrydonGibson Je soupçonne qu'à l'origine, l'idée était que l'auteur du correctif pouvait écrire indifféremment diff old/foo new/foo >my.patchou diff ../old/foo foo >my.patchou diff foo.old foo >my.patchet que l'utilisateur pouvait l'appliquer patch <my.patchsans 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, patchc'est un ancien utilitaire et au moment où j'ai commencé à l'utiliser -p0ou j'étais -p1déjà le moyen le plus courant de l'utiliser.
Gilles 'SO- arrête d'être méchant'
16

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 -p0donne le nom de fichier entier non modifié , -p1donne

 u/howard/src/blurfl/blurfl.c

sans barre oblique , -p4donne

 blurfl/blurfl.c
Stéphane Gimenez
la source
4

La différence est que le nombre après -pspé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' -p0argument traitera le chemin tel quel :

/Barack/Obama

Mais nous pouvons couper le chemin tout en corrigeant:

-p1supprimera 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 patchcomportement, lisez ce fil .

JohnDoea
la source