Как я могу применить отклоненные куски после их исправления?
Я пытаюсь применить патч к файлу с помощью 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
будет изменять файлы там, где это возможно.