Diff sempre falha em aplicar patch de arquivos que eu faço?

2

Eu tenho alguns arquivos no meu servidor que eu queria fazer um patch, então eu peguei um dos arquivos para testar:

cp /path/file ~/file

Então, agora eu tenho apenas o mesmo arquivo no diretório raiz, então faço as alterações necessárias no arquivo ~ / file e agora executo o comando diff nos dois arquivos:

diff -Nuar /path/file ~/file > my_file.patch

Eu também tentei:

diff -u /path/file ~/file > my_file.patch
diff -c /path/file ~/file > my_file.patch
diff /path/file ~/file > my_file.patch

Agora, como você pode ver, não há diferenças nos arquivos além do que acabei de alterar, mas ao invés de criar um my_file.patch com apenas o código para corrigir as alterações que eu fiz em / path / file ele sempre cria um arquivo completo com todo o conteúdo de / path / arquivo marcado para ser removido e o conteúdo de ~ / arquivo marcado para ser adicionado.

Então eu tento aplicar o patch:

patch -p0 < ~/my_file.patch

E ele falha muito ... sempre imprime um arquivo rejeitado com todo o conteúdo, assim como o arquivo.

Eu estou ficando sem idéias para o porquê de estar fazendo isso o tempo todo, com alguns arquivos eu posso produzir um patch sem problemas, mas com a maioria dos arquivos no sistema eu preciso fazer um, não funciona em tudo.

Alguma idéia do que poderia ser o problema? codificação, formato? soluções?

    
por Prix 01.11.2010 / 16:39

2 respostas

2

É possível que alguns dos arquivos tenham finais de linha do Windows (DOS) em vez de novas linhas do Unix? Tente executar dos2unix neles antes de fazer o diff .

Tanto o dos2unix quanto o fromdos (no meu sistema, o primeiro é um link simbólico para o último) aceitam nomes de arquivos na linha de comando e fazem a conversão no lugar. Você pode usar a opção -b para fazer um backup. Se você tiver muitos desses arquivos em vários diretórios, poderá usar find para processá-los.

find /dir/to/start -type f -name "foo*" -exec fromdos -b {} +

Então, quando estiver satisfeito, tudo correu bem:

find /dir/to/start -type f -name "foo*.bak"  -delete

para excluir os backups.

    
por 01.11.2010 / 18:49
0

patch é muito sensível ao seu diretório atual e à opção -p . Você tem certeza de que está tentando aplicar o patch do local correto? Você está especificando um prefixo (via -p ) apropriado para o conteúdo do seu arquivo de correção?

    
por 01.11.2010 / 17:06