Ao aplicar patches, qual é a diferença entre os argumentos -p0 e -p1?

19

Qual é a diferença entre patch -p0e patch -p1?

Existe alguma diferença?

chrisjlee
fonte

Respostas:

23

A maneira mais comum de criar um patch é executar o diffcomando ou o comando interno de algum controle de versão diff. Às vezes, você está apenas comparando dois arquivos e é executado diffassim:

diff -u version_by_alice.txt version_by_bob.txt >alice_to_bob.patch

Em seguida, você recebe um patch que contém alterações para um arquivo e não contém um nome de arquivo. Ao aplicar esse patch, você precisa especificar em qual arquivo deseja aplicá-lo:

patch <alice_to_bob.patch version2_by_alice.txt

Freqüentemente, você está comparando duas versões de um projeto inteiro com vários arquivos contidos em um diretório. Uma chamada típica de se diffparece com isso:

diff -ru old_version new_version >some.patch

Em seguida, o patch contém nomes de arquivos, fornecidos em linhas de cabeçalho como diff -ru old_version/dir/file new_version/dir/file. Você precisa informar patchpara retirar o prefixo ( old_versionou new_version) do nome do arquivo. É isso que -p1significa: retire um nível de diretório.

Às vezes, as linhas de cabeçalho no patch contêm o nome do arquivo diretamente, sem indicações. Isso é comum nos sistemas de controle de versão; por exemplo, cvs diffproduz linhas de cabeçalho que se parecem diff -r1.42 foo. Como não há prefixo para remover, você deve especificar -p0.

No caso especial, quando não há subdiretórios nas árvores que você está comparando, nenhuma -popção é necessária: patchdescartará toda a parte do diretório dos nomes dos arquivos. Mas na maioria das vezes, você precisa de um -p0ou -p1, dependendo de como o patch foi produzido.

Gilles 'SO- parar de ser mau'
fonte
Isso me confundiu por tanto tempo. Por que o comportamento de nenhum subdiretório é diferente de -p0? Eu sempre assumiu que -p0 foi padrão, então eu sempre tive problemas se ele era suposto ser p0
Brydon Gibson
@BrydonGibson Suspeito que originalmente a idéia era que o autor do patch pudesse escrever com indiferença diff old/foo new/foo >my.patchou diff ../old/foo foo >my.patchou diff foo.old foo >my.patche o usuário pudesse aplicá-lo patch <my.patchsem ter que se preocupar com a maneira como o patch foi produzido e, em seguida, -pfoi adicionado como uma conveniência. Mas na verdade eu não sei, patché um utilitário antigo e quando comecei a usá-lo -p0ou -p1já era a maneira mais comum de usá-lo.
Gilles 'SO- stop be evil'
16

Do homem:

-pnum ou --strip=num Retire o menor prefixo que contém as barras principais de cada nome de arquivo encontrado no arquivo de correção. Uma sequência de uma ou mais barras adjacentes é contada como uma única barra. Isso controla como os nomes dos arquivos encontrados no arquivo de patch são tratados, caso você mantenha seus arquivos em um diretório diferente do que a pessoa que enviou o patch. Por exemplo, supondo que o nome do arquivo no arquivo de correção fosse:

 /u/howard/src/blurfl/blurfl.c

A configuração -p0fornece o nome completo do arquivo sem modificação , -p1fornece

 u/howard/src/blurfl/blurfl.c

sem a barra principal , -p4

 blurfl/blurfl.c
Stéphane Gimenez
fonte
4

A diferença é que o número depois -pespecificaria o número de componentes do caminho que seriam removidos.

Diga que temos um caminho /Barack/Obama. A execução de um patch nele com o -p0argumento tratará o caminho como está :

/Barack/Obama

Mas podemos aparar o caminho durante o patch:

-p1removerá a barra raiz (observe que agora será apenas Barack, sem uma barra):

Barack/Obama

-p2 removerá Barack (e a barra direita adjacente):

 Obama

Para expandir o "porquê" desse patchcomportamento, leia este tópico .

JohnDoea
fonte