Как я могу применить отклоненные куски после их исправления?

Я пытаюсь применить патч к файлу с помощью git apply. Общий патч не удался, поэтому я использовал git apply --reject.

Проверка созданного файла .rej показала мне, что неправильно, теперь я исправил проблему в файле .rej.

Но попытка применить файл .rej завершается с сообщением

фатальный: фрагмент патча без заголовка в строке 2:...

Есть ли способ re- применить файл .rej после устранения проблем там? Или мне нужно изменить исходный патч и использовать re- run git apply?

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

Ответ 1

Чтобы уточнить, что сказал @julian-squires, проблема в том, что в файлах .rej отсутствуют некоторые незначительные вещи между diff a/thefile... и @@-line/columns...

ORIGINAL .rej файл

diff a/the/original/file.cs b/the/original/file.cs    (rejected hunks)
@@ -27,9 +27,9 @@ whatever was on that line

Вам нужно скопировать имена файлов a/b из строки diff и добавить их с индикаторами изменений ниже, например:

ОБНОВЛЕНО .rej файл

diff a/the/original/file.cs b/the/original/file.cs    (rejected hunks)
--- a/the/original/file.cs
+++ b/the/original/file.cs
@@ -27,9 +27,9 @@ whatever was on that line

Затем вы можете применять файлы .rej как обычный патч.

Ответ 2

У меня была эта проблема в последнее время, при использовании git am --reject чтобы применить кучу патчей. То, как я подошел к нему, - это массаж .rej файла .rej во что-то, что patch(1) распознает, с

sed -e 's/^diff a\/\(.*\) b\/\(.*\)[[:space:]].*rejected.*$/--- \1\n+++ \2/'

и модифицировали их с помощью emacs (чей diff-mode будет обновлять количество строк в ханках при изменении патча) и применял их с patch.

Мой рабочий процесс выглядел так:

$ (for i in $(find . -name \*.rej); do
     sed -e 's/^diff a\/\(.*\) b\/\(.*\)[[:space:]].*rejected.*$/--- \1\n+++ \2/' -i $i &&
     emacsclient $i &&
     patch -p0 < $i;
   done) && git add -u && git clean -xdf && git am --continue

с подходящей настройкой макросов в emacs для повторяющихся случаев. Не самый элегантный подход, но он сработал.

Ответ 3

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