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.

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 .


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


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.


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.


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.


-3

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


-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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.