Quando corrige qual é a diferença entre os argumentos -p0 e -p1?

17

Qual é a diferença entre patch -p0 e patch -p1 ?

Existe alguma diferença?

    
por chrisjlee 09.12.2011 / 23:45

3 respostas

21

A maneira mais comum de criar um patch é executar o comando diff ou o comando diff -like integrado do controle de versão. Às vezes, você está apenas comparando dois arquivos e executa diff da seguinte forma:

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 o arquivo para o qual deseja aplicá-lo:

patch <alice_to_bob.patch version2_by_alice.txt

Geralmente, você está comparando duas versões de um projeto multi-arquivo inteiro contido em um diretório. Uma chamada típica de diff se parece com isso:

diff -ru old_version new_version >some.patch

Em seguida, o patch contém nomes de arquivos, dados em linhas de cabeçalho como diff -ru old_version/dir/file new_version/dir/file . Você precisa informar patch para remover o prefixo ( old_version ou new_version ) do nome do arquivo. Isso é o que significa -p1 : tira um nível de diretório.

Às vezes, as linhas de cabeçalho no patch contêm o nome do arquivo diretamente, sem nenhuma instrução. Isso é comum em sistemas de controle de versão; por exemplo, cvs diff produz linhas de cabeçalho parecidas com diff -r1.42 foo . Então não há prefixo para strip, então você deve especificar -p0 .

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

    
por 10.12.2011 / 00:19
16

Do homem:

-pnum or --strip=num Strip the smallest prefix containing num leading slashes from each file name found in the patch file. A sequence of one or more adjacent slashes is counted as a single slash. This controls how file names found in the patch file are treated, in case you keep your files in a different directory than the person who sent out the patch. For example, supposing the file name in the patch file was:

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

setting -p0 gives the entire file name unmodified, -p1 gives

 u/howard/src/blurfl/blurfl.c

without the leading slash, -p4 gives

 blurfl/blurfl.c
    
por 10.12.2011 / 00:03
3

A diferença é que o número após -p especificaria o número de componentes do caminho que seriam removidos.

Digamos que tenhamos um caminho /Barack/Obama . Executar um patch nele com o argumento -p0 tratará o caminho como é :

/Barack/Obama

Mas podemos aparar o caminho durante o patch:

-p1 removerá a barra raiz (observe que agora será apenas o Barack, sem uma barra esquerda):

Barack/Obama

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

 Obama

Para expandir o "porquê" deste comportamento patch , leia este tópico .

    
por 13.07.2016 / 14:59

Tags