Постоянно меняющий файл патча - PullRequest
35 голосов
/ 11 октября 2010

Иногда по какой-то причине мне приходится создавать патч-файлы (под Linux), которые находятся в неправильном направлении. Я знаю, что могу справиться с этим, используя переключатель -R при применении его через patch, но было бы неплохо, если бы существовал способ навсегда изменить файл патча. Есть ли утилита, которая может сделать это, или, например, регулярное выражение, которое будет гарантированно работать?

UPDATE

Ли Райан предложил изящный способ сделать это . Тем не менее, он требует доступа к исходным файлам. Поэтому я полагаю, что мне следует обновить мой вопрос, чтобы заявить, что я более заинтересован в том, чтобы добиться этого, учитывая только сам файл исправления.

Ответы [ 3 ]

49 голосов
/ 11 октября 2010

Вы можете использовать инструмент interdiff(1) из patchutils . В частности, в справочной странице для interdiff написано:

Чтобы отменить патч, используйте / dev / null для diff2.

Итак,

$ interdiff -q file.patch /dev/null > reversed.patch

-q / --quiet предотвращает вставку reverted: строк.

15 голосов
/ 11 октября 2010

Попробуйте:

patch -R file.txt file.patch
diff file.txt.orig file.txt > file.patch.rev
// you can then `rm file.txt.orig file.patch`

РЕДАКТИРОВАТЬ:

Чтобы отменить унифицированный дифференциал, вам нужно изменить три вещи:

  • заголовок патча
  • заголовок куска
  • + к - и - к +

Итак, вот как выглядит заголовок патча для:

--- b.asm   2010-09-24 12:03:43.000000000 +1000    
+++ a.asm   2010-09-24 23:28:43.000000000 +1000

вам нужно повернуть его так, чтобы оно выглядело так:

--- a.asm   2010-09-24 23:28:43.000000000 +1000
+++ b.asm   2010-09-24 12:03:43.000000000 +1000    

в основном переключите порядок и переключите +++ на --- и наоборот.

Далее заголовок чанка:

@@ -29,5 +27,7 @@

Вам нужно поменять местами цифры, чтобы они выглядели так:

@@ -27,7 +29,5 @@

в основном, переключение пар номеров

и последнее, переключайте каждую строку, начинающуюся с +, и каждую строку, начинающуюся с -.

EDIT:

чтобы переключить заголовок чанка, вы можете сделать:

sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/"

для переключения + на - и - на +, вы можете сделать:

sed -e "s/^+/P/" -e "s/^-/+/" -e "s/^P/-/"

НАКОНЕЦ:

чтобы изменить заголовок патча, выполните:

head -2 orig.diff | tac | sed -e "s/+++/PPP/" -e "s/---/+++/" -e "s/PPP/---/" > head
tail orig.diff -n+3 > tail
cat head tail > headtail
rm head tail

Итак, наконец, наш (быстрый и грязный) скрипт выглядит так:

#!/usr/bin/env sh
F="$1"
head -2 $F | tac | sed -e "s/+++/PPP/" -e "s/---/+++/" -e "s/PPP/---/" > $F.head
tail $F -n+3 | sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/" -e "s/^+/P/" -e "s/^-/+/" -e "s/^P/-/" > $F.tail
cat $F.head $F.tail 
rm $F.head $F.tail

Я проверил, и, кажется, работает.

хотя, чтобы сделать вещи более удобными в обслуживании и более чистыми:

#!/usr/bin/env sh
swap() {
    sed -e "s/^$1/PPP/" -e "s/^$2/$1/" -e "s/^PPP/$2/"
}
file_header() {
    head -2 $1 | tac | swap +++ ---
}
fix_chunk_header() {
    sed -e "s/@@ -\([0-9]\+,[0-9]\+\) +\([0-9]\+,[0-9]\+\) @@/@@ -\2 +\1 @@/" 
}
fix_lines() {
    swap + -
}
file="$1"
file_header $file
tail $file -n+3 | fix_chunk_header | fix_lines
0 голосов
/ 06 июля 2015

Я применил патч patch -N -p0 < path/file.patch, но я столкнулся с проблемами компиляции из-за неполного кода, все, что я сделал, это запустил эту команду patch -p0 -R < path/file.patch. Ссылка ссылка

...