Respostas:
A maneira mais comum de criar um patch é executar o diff
comando ou o comando interno de algum controle de versão diff
. Às vezes, você está apenas comparando dois arquivos e é executado diff
assim:
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 diff
parece 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 patch
para retirar o prefixo ( old_version
ou new_version
) do nome do arquivo. É isso que -p1
significa: 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 diff
produz 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 -p
opção é necessária: patch
descartará toda a parte do diretório dos nomes dos arquivos. Mas na maioria das vezes, você precisa de um -p0
ou -p1
, dependendo de como o patch foi produzido.
diff old/foo new/foo >my.patch
ou diff ../old/foo foo >my.patch
ou diff foo.old foo >my.patch
e o usuário pudesse aplicá-lo patch <my.patch
sem ter que se preocupar com a maneira como o patch foi produzido e, em seguida, -p
foi adicionado como uma conveniência. Mas na verdade eu não sei, patch
é um utilitário antigo e quando comecei a usá-lo -p0
ou -p1
já era a maneira mais comum de usá-lo.
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
-p0
fornece o nome completo do arquivo sem modificação ,-p1
forneceu/howard/src/blurfl/blurfl.c
sem a barra principal ,
-p4
dáblurfl/blurfl.c
A diferença é que o número depois -p
especificaria 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 -p0
argumento tratará o caminho como está :
/Barack/Obama
Mas podemos aparar o caminho durante o patch:
-p1
removerá 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 patch
comportamento, leia este tópico .