Ошибка при применении патча в git
У меня есть мелкий клон, на котором я сделал три фиксации.
Вот журнал:
$git log --online --graph --decorate --all
* d3456fd (HEAD, мастер) патч 3
* 9713822 патч 2
* 6f380a6 патч 1
* 8a1ce1e (происхождение/мастер, происхождение /HEAD ) из полного клона
* 7c13416 добавлен из неглубоких * 3b3ed39 удален адрес электронной почты
* cfbed6c дальнейшие изменения
* a71254b добавлен для релиза 2.1
* 7347896 (привитые) изменения для релиза 2
теперь я создаю патч отсюда:
$git format-patch -k --stdout origin > ../format_since_origin.patch
Я хочу применить этот патч в другом клоне, который является полным клоном.
Вот журнал:
$git log --online --graph --decorate --all
* 8a1ce1e (HEAD, начало/мастер, мастер) из полного клона
* 7c13416 добавлен из неглубоких * 3b3ed39 удален адрес электронной почты
* cfbed6c дальнейшие изменения
* a71254b добавлен для релиза 2.1
* 7347896 изменений для релиза 2
* b1a8797 изменяет файлы ttwo
* 603710c изменил протокол испытаний
* 16b20b3 добавлен test_report.txt
* f0871ea модифицированный файл1.xml
* dd94bfc добавил file1.xml
* 00758aa second commit
* 49f9968 first commit
Я не могу применить патч, созданный из мелкого клона выше. Я получаю следующую ошибку.
$git am -3/c/temp/ git/format_since_origin.patch
Применение: patch 1
Использование индексной информации для восстановления базового дерева...
Ошибка: исправлена ошибка: file1.c: 6
error: file1.c: патч не применяется
Вы отредактировали свой патч?
Это не относится к блобам, записанным в его индексе.
Невозможно вернуться к трехстороннему слиянию.
Патч завершился неудачей при патче 0001 1
Когда вы решите эту проблему, запустите "git am --resolved".
Если вы предпочтете пропустить этот патч, вместо этого запустите "git am --skip".
Чтобы восстановить исходную ветвь и остановить выполнение патча "git am --bort".
Любая идея, почему этот патч не работает? Или мой метод совершенно не прав?
Update:
Он работает со следующим
$git am -3 --ignore-whitespace/c/temp/ git/format_since_origin.patch Применение: патч 1 Применение: patch 2 Применение: patch 3
Теперь, как предложил Чарльз - если я попробую diff git, я получу ошибку, как показано ниже.
$git diff -p origin > ../dif_origin.patch
При применении,
$git применить --ignore-whitespace --inaccurate-eof/c/temp/ git/dif_origin.patch
c:/temp/git/dif_origin.patch:9: конечные пробелы.
изменение патча для file1.c
c:/temp/git/dif_origin.patch:18: конечные пробелы.
патч этого парня xml
c:/temp/git/dif_origin.patch:29: завершение пробелов.
fsdfsd
c:/temp/git/dif_origin.patch.30: завершение пробела.
исправить этот отчет
Ошибка: исправлена ошибка: file1.c: 6
error: file1.c: патч не применяется
Ошибка: исправлена ошибка: file1.xml: 2
error: file1.xml: патч не применяется
Ошибка: исправлена ошибка: tr/test_report.txt: 2
error: tr/test_report.txt: патч не применяется
Ответы
Ответ 1
Обратите внимание, что одним из оснований для игнорирования пробелов было (June 2010):
Что он делает, это включить GMail -> download -> git-am workflow
.
GMail (и, несомненно, бесчисленное множество других). Поставщики электронной почты вводят пробелы в начале сырых сообщений электронной почты, в то же время оставляя их неповрежденными.
Как указано в разделе git am/format-patch
: формат управления концами строк", вы можете попробовать:
git am --keep-cr
Это не требует, чтобы вы игнорировали пробелы (только предупреждение).
OP maxmelbin подтверждает в комментариях, что работает следующее:
git am -3 --keep-cr --committer-date-is-author-date /c/temp/git/format_since_origin.patch
Ответ 2
Когда приложение git работает нормально, вы не получаете никакого вывода:
$ git apply example.patch
[nothing returned]
Если вы хотите посмотреть, что происходит за кулисами, вы можете использовать флаг -v (verbose):
$ git apply -v example.patch
Checking patch includes/common.inc...
Applied patch includes/common.inc cleanly.
Однако, если запуск git применяется в вашей локальной локальной рабочей папке git, возможно, что даже при значении -v (verbose), git apply ничего не сделает и не даст результата. Если это произойдет, проверьте свое местоположение в дереве каталогов - git apply может работать из другого места.
Альтернативой git применяется использование команды patch:
$ patch -p1 < example.patch
Вот другой вывод, который может сгенерировать команда приложения git, и что это значит.
Патч не применяется
$ git apply example.patch
error: patch failed: includes/common.inc:626
error: includes/common.inc: patch does not apply``
Git не удалось применить изменения в патче, потому что он не смог найти строку (строки) рассматриваемого кода; они должны быть изменены или удалены другой фиксацией. Попробуйте следующее:
Убедитесь, что патч еще не был применен. Найдите его в git -log или просто просмотрите код, чтобы узнать, имеются ли изменения (-и). Если да, то все готово. Если они не являются или только некоторые из них, попробуйте что-то еще:
Используйте patch -p1 < filename.patch
. В то время как git -приложение вообще отвергает патч с любыми ошибками, patch -p1 работает с hunk с помощью hunk, применяя столько индивидуальных изменений, сколько может. Он копирует каждый файл как filename.ext.orig перед его модификацией и сохраняет отклоненные куски в filename.ext.rej
. Отмените файлы .orig и вручную примените изменения, оставленные в .rej. Это легкая стратегия для небольших патчей.
Ответ 3
ок. работало.
$git am -3 --ignore-whitespace/c/temp/ git/format_since_origin.patch
Применение: patch 1
Применение: patch 2
Применение: patch 3
Почему мне нужно игнорировать пробелы во время применения?