Respostas:
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.
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.
Do homem:
-pnumou--strip=numRetire 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.cA configuração
-p0fornece o nome completo do arquivo sem modificação ,-p1forneceu/howard/src/blurfl/blurfl.csem a barra principal ,
-p4dáblurfl/blurfl.c
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 .