Executando “patch” sem gerar arquivos * .orig e * .rej

20

É possível dizer patchpara não gerar .orige .rejarquivos? Acho extremamente irritante que o patch os crie.

TheLegassis
fonte

Respostas:

14

Se você não estiver dando outra opção a patchnão ser -pN, ele só criará esses arquivos quando um patch não for aplicado corretamente.

Portanto, uma opção é parar de criar (ou aceitar) patches ruins. :)

De volta ao mundo real, esse é um recurso. Quando patch(1)falha ao aplicar um segmento de correção ao arquivo original, ele salva a cópia temporária do arquivo original de maneira duradoura *.orig, despeja o segmento rejeitado *.reje continua tentando aplicar segmentos de correção. A idéia é que você possa abrir o *.rejarquivo e concluir o processo de correção manualmente, copiando bits e partes para o arquivo corrigido. O *.origarquivo também pode ser útil quando o processo de correção destrói acidentalmente algo e você precisa consultar a versão original para corrigi-lo.

Nem sempre corrijo um patch incorreto com o texto dos arquivos *.reje *.orig, mas é bom tê-los, caso eu precise deles.

Depois de corrigir um patch incorreto, executei o seguinte script na raiz do projeto para limpar rapidamente as coisas:

#!/bin/bash
find . '(' \
    -name \*-baseline -o \
    -name \*-merge -o \
    -name \*-original -o \
    -name \*.orig -o \
    -name \*.rej \
')' -delete

Eu o chamo cleanup-after-bad-patchporque o nome longo se protege parcialmente contra a execução acidental, pois pode remover os arquivos que você ainda precisa. Para ser sincero, normalmente, eu o executo digitando cleanTabEnter, sendo suficiente para encontrar esse script nas PATHmáquinas de desenvolvimento.

Os padrões adicionais que ele procura são os arquivos emitidos pelo meu sistema de controle de versão preferido quando encontrar o mesmo problema durante uma operação de mesclagem. Você pode ajustá-lo para suas ferramentas VCS / SCM .

Warren Young
fonte
7

Para dizer patch não para backups produzir apenas omitir os -be quaisquer --backup-...opções.

Para instruí-lo a não criar .rejarquivos, adicione a -r -opção ao comando

Sarja
fonte
4
Isso não funciona para mim - apenas coloca os rejeitos em um arquivo chamado "-", que é um nome de arquivo muito irritante para se ter por perto. Estou usando a versão 2.5.8 em um Mac.
Rjmunro 28/01
trabalhando ok no GNU patch 2.6mac, talvez tente-r /dev/null
Stuart Cardall 13/03
3

A --no-backup-if-mismatchopção evitará os arquivos ".orig".

Você também pode tentar a --mergeopção, que cria um conflito no arquivo.

Em todos os casos, você deve ter uma maneira de voltar rapidamente a um bom estado se a mesclagem se tornar esmagadora.

Cody Allan Taylor
fonte
1

Estou preso com o patch v2.5.4, onde -r -faz com que ele crie arquivos rejeitados nomeados -.

Descobri que, --reject-file=ou seja, o valor vazio faz com que o patch falhe com o código de saída, 2 se ele tentar gravar um arquivo rejeitado. Se não houver rejeições, ele funcionará conforme o esperado. Embora não seja uma solução completa para a versão mais antiga do patch, em algumas circunstâncias isso pode ser aceitável ou desejado.

AnyDev
fonte
0

O melhor que eu pude imaginar (reconhecidamente uma maneira de varrer a sujeira para debaixo do tapete) é usar -r <tmpfile>, ou seja:

# patch -r /tmp/deleteme.rej -i patchfile filetobepatched

já que na v2.5.8, -r -na verdade , cria o -arquivo.

PJ_Finnegan
fonte
-3

patch -p1 -B / dev / null -r - <arquivo.patch

MAX
fonte
-1: Este é um péssimo conselho. Primeiro, o -Bsinalizador não envia a *.origsaída para /dev/null, como parece do seu comando. Acontece que usuários normais não podem gravar em arquivos chamados de coisas assim /dev/nullfoo.cpp. Se você fizer isso como root, receberá lixo em sua /devárvore. Segundo, -r -não suprime o *.rejarquivo. Parece que isso ocorre porque o erro devido à -Bbandeira falsa impede que ele mostre o que realmente faria sem o -B, que é criar um arquivo chamado -no diretório atual.
Warren Young
11
@WarrenYoung de acordo com man patch: "-r Coloque rejeições no arquivo de rejeição, em vez do arquivo .rej padrão. Quando o arquivo de rejeição é -, descarte as rejeições."
Limbo Peng