Проверить, был ли применен git apply

Этот вопрос о git apply

Есть ли способ отличить: это не удалось, потому что...

  1. ... патч уже применен
  2. ... исходный код действительно отличается

Каталог, в котором я работаю, не является каталогом git, поэтому я не могу использовать git log или что-то другое.

Я знаю о -R (обратный вариант), поэтому мой текущий обходной путь заключается в следующем:

git apply abc.patch || git apply abc.patch -R --check && echo already applied

Сюда git apply abc.patch -R --check && git apply abc.patch будет выполнен, только если git apply abc.patch происходит сбой, затем проверяется, не удалось ли это, потому что исправление уже применено (git apply abc.patch -R --check) и если это так, то это повторяет "уже применено"

Но мне это не нравится, разве что-то вроде встроенного решения в git's apply?

2 ответа

Фактически, это именно то "встроенное в git" решение, которое вы ищете. Для таких случаев, как множество идентичных строк, описанных в другом ответе, все, что вам нужно сделать, это убедиться, что ваш файл патча имеет больше / достаточно контекста для устранения неоднозначности (например, с помощью ).

Пример: если в патче сказано «удалить одну из этих 50 одинаковых строк, оставив 49», результаты будут четко определены:

  • При менее 49 из этих строк или более чем 50 из этих строк патч не применяется: обе и не удастся.
  • Ровно с 49 из этих строк патч уже применен: выйдет из строя и будет успешным.
  • Ровно с 50 из этих строк патч не применялся: получится и потерпит неудачу.
  • Если и оба успешны, вам нужно увеличить контекст для исправления неоднозначности.

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

Короткий ответ - нет, или, по крайней мере, не совсем.

Обратите внимание: патч - это набор инструкций, говорящих "убери эту строку" и "добавь эти другие строки". Предположим, патч для file читает полностью:

diff --git a/file b/file
index 87cdbbd..3d8696b 100644
--- a/file
+++ b/file
@@ -7,4 +7,3 @@ this file is dull
 this file is dull
 this file is dull
 this file is dull
-this file is dull

Другими словами, входной файл был очень скучным, по крайней мере ближе к концу, где он просто повторял "этот файл скучный".

Изменением в файле было удаление одной из этих скучных строк. Контекст больше, одинаково скучные строки, за которыми следует "конец файла".

Так как патч был сгенерирован, кто-то изменил верхнюю часть файла так, чтобы он больше не был просто 10 (или 9) скучными строками, а все равно заканчивался как минимум четырьмя скучными строками. Файл имеет длину более 50 строк, большинство из которых довольно захватывающие, по крайней мере, сравнительно.

Можете ли вы, как умный человек, сказать, применен ли патч к этому файлу или нет? Все, что я скажу вам, это то, что исправление может или не может быть применено, наряду с другими изменениями, которые добавили много интересных строк в верхней части файла.

Если вы не можете сказать, почему вы верите, что Git может? Я не знаю о вас, но я не могу сказать, удаляло ли изменение, добавившее захватывающие строки, последнее скучное.

(Теперь, в некоторых случаях, особенно если у вас есть это index 87cdbbd..3d8696b 100644 строка - есть способ узнать, при условии, что у вас также есть подтвержденная версия файла, чей идентификатор хеша 87cdbbd, потому что теперь мы можем извлечь эту конкретную версию файла. Но вы еще не сказали, есть ли у вас индексная строка, и если да, есть ли у вас также большой двоичный объект с совпадающим хэш-идентификатором.)

Другие вопросы по тегам