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.