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

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

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

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

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

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

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

3 ответа

Решение

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

ОРИГИНАЛ .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 файлы как обычный патч.

У меня недавно была эта проблема при использовании git am --reject применить кучу патчей. То, как я подошел к этому, было сделать массаж .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 для повторяющихся случаев. Не самый элегантный подход, но это сработало.

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

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