Создать патч, показывающий меньше удаленных строк - PullRequest
1 голос
/ 02 июля 2019

Мне нужно создать патч между различными версиями программного обеспечения в двух каталогах, и этот патч будет доставлен моему клиенту.Они должны иметь возможность применить этот патч к более старой версии, чтобы обновить его до более новой версии.Из-за требований безопасности (ищите вредоносный код и т. Д.), Я должен прочитать каждую строчку этого патча своими собственными глазами.Мне бы не хотелось читать весь удаленный код, потому что, если есть 150 тыс. Удаленных строк и 100 тыс. Добавленных строк, я должен прочитать 250 тыс. Строк, когда действительно стоит прочитать только 100 тыс.

В настоящее время я создам патч, используя:

diff -N -r --unified=1 old new > patch.diff

Затем патч применяется, используя:

cp -r old new
cd new
patch -N -p1 < ../patch.diff

В качестве примера, у меня есть такая структура каталогов:

[user@hostname test]$ tree -af
.
├── ./new
│   ├── ./new/a.txt
│   ├── ./new/b.txt
│   └── ./new/c.txt
└── ./old
    ├── ./old/a.txt
    └── ./old/c.txt

В новой версии был добавлен новый файл b.txt, был изменен a.txt, и в c.txt были удалены все строки, но он все еще существует.Запуск моего текущего создания патча приведет к следующему различию:

[user@hostname test]$ diff -N -r --unified=1 old new
diff -N -r '--unified=1' old/a.txt new/a.txt
--- old/a.txt   2019-07-01 18:09:59.586410797 -0400
+++ new/a.txt   2019-07-01 18:17:19.680446218 -0400
@@ -3,2 +3,3 @@
 a
+h
 a
@@ -8,2 +9,3 @@
 a
+awdwd
 a
@@ -11,23 +13,5 @@
 a
-a
-a
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
 b
+foo
+bar
 b
@@ -39,2 +23,9 @@
 c
+d
+d
+d
+d
+d
+d
+d

diff -N -r '--unified=1' old/b.txt new/b.txt
--- old/b.txt   1969-12-31 19:00:00.000000000 -0500
+++ new/b.txt   2019-07-01 18:10:52.943204070 -0400
@@ -0,0 +1 @@
+this is an entirely new file
diff -N -r '--unified=1' old/c.txt new/c.txt
--- old/c.txt   2019-07-01 18:16:11.820985994 -0400
+++ new/c.txt   2019-07-01 18:14:59.775620402 -0400
@@ -1 +0,0 @@
-this is a file that will be empty in the new version

В идеале, мне не нужно читать все удаленные строки "b" в a.txt.Файл исправления может просто указывать номера строк, которые нужно удалить без их содержимого, или, может быть, складывать целые удаленные разделы больше N - для меня это не имеет значения, если исправление все еще можно безопасно применить.

1 Ответ

1 голос
/ 02 июля 2019

git не поддерживает создание патча в той форме, в которой вы нуждаетесь, и не хотел бы применять такой патч, если бы он был предоставлен, потому что он не смог бы проверить, применял ли патч, как предполагалось. Я понимаю, что эта мера безопасности может не относиться к вашему варианту использования, но она применима к случаю использования, для которого предназначены git-патчи.

Так, например, если у вас есть файл

a
b
c

и вы редактируете его как

a
c

вам может понадобиться патч с надписью "удалить строку 2"; но когда вы применяете исправление к целевой копии, git беспокоится о том, что копия могла быть изменена - поскольку вся цель git - распределенная разработка. И если цель была отредактирована так, чтобы строка 2 теперь была чем угодно, кроме

b

тогда возникает технически конфликт.

(Существует опция -D для git format-patch, которая связана с тем, что вы хотите, но она пропускает только предварительные образы целых файлов , которые удаляются.)

Так что вам понадобится другой инструмент. Я не знаю хорошего для этой цели. Вы можете написать несколько пользовательских сценариев, но сложность и риск выше, чем может показаться на первый взгляд.

...