Aplicando um único patch aos arquivos em vários diretórios

1

As estruturas de diretório são assim:

orig/l1/l2/file2patch

orig/l1-2/file2patch

Difundido com

new/l1/l2/file2patch

new/l1-2/file2patch

Eu obtenho o diff correto entre esses arquivos e salvo em um arquivo, mas aplicá-lo provou ser não-trivial.

Eu tentei patch -d orig/ < patch.diff , mas o -d espera que os arquivos a serem corrigidos vivam imediatamente em orig

Existe alguma maneira de fazer o patch se repetir em um diretório e aplicar o patch aos arquivos especificados que existem no patch?

    
por cbrad 15.04.2016 / 00:41

1 resposta

1

Embora os nomes de caminho fornecidos não pareçam corretos (especialmente a árvore new , que outra pessoa alterou), você pode ter em mente que o programa patch pode ser instruído a ignorar um determinado número de níveis de diretório da saída de diff usando a opção -p .

Ao aplicar um patch aos arquivos em um diretório diferente do mostrado pelo arquivo de patch, você deve cd no diretório (para cancelar uma parte da diferença) e usar a opção -p para ajustar o cd .

Aqui está um pequeno script ilustrando como eu resolveria isso (usando a opção dry-run do patch GNU para uma listagem simples):

#!/bin/sh
cd /tmp/foo
OUT=/tmp/patch.diff
rm -f $OUT
diff -u orig/l1/l2/file2patch new/l1/l2/file2patch >>$OUT
diff -u orig/l1-2/file2patch new/l1-2/file2patch >>$OUT

diffstat -p1 $OUT
cd orig
patch -p1 --dry-run <$OUT

Entradas:

$ find . -type f
./new/l1/l2/file2patch
./new/l1-2/file2patch
./orig/l1/l2/file2patch
./orig/l1-2/file2patch

Saída:

$ /tmp/xx
 l1-2/file2patch  |   19 +++++++++++++------
 l1/l2/file2patch |    5 ++---
 2 files changed, 15 insertions(+), 9 deletions(-)
/tmp/foo/orig
patching file l1/l2/file2patch
patching file l1-2/file2patch

Leitura adicional:

  • diff - compare dois arquivos (POSIX)
  • patch - aplica alterações aos arquivos (POSIX)
  • diffstat - faz histograma a partir do diff-output
por 15.04.2016 / 01:23

Tags