ошибка git am: "патч не применяется"
я пытаюсь переместить несколько коммитов из одного проекта во второй, аналогичный, используя git.
поэтому я создал патч, содержащий 5 коммитов:
git format-patch 4af51 --stdout > changes.patch
затем переместите патч в папку второго проекта и хотите применить патч:
git am changes.patch
...но это дает мне ошибку:
Applying: Fixed products ordering in order summary.
error: patch failed: index.php:17
error: index.php: patch does not apply
Patch failed at 0001 Fixed products ordering in order summary.
The copy of the patch that failed is found in:
c:/.../project2/.git/rebase-apply/patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
так что я открыл индекс.php, но там ничего не изменилось. Я предполагаю, что некоторые >>>>>>> метки etc., например, при разрешении конфликта слияния, но нет конфликт был отмечен в файле. git status дали мне пустой список измененных файлов (только changes.patch там был). Поэтому я бегу git am --continue, но появляется еще одна ошибка:
Applying: Fixed products ordering in order summary.
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
я использую Windows 7 и новейшую версию git " 1.9.4.msysgit.1"
P. S. После нескольких часов погуглив, я нашел несколько решений, но ничего не работает для меня:
git am -3 changes.patch
дает странную ошибку" sha1 information":
Applying: Fixed products ordering in order summary.
fatal: sha1 information is lacking or useless (index.php).
Repository lacks necessary blobs to fall back on 3-way merge.
Cannot fall back to three-way merge.
Patch failed at 0001 Fixed products ordering in order summary.
The copy of the patch that failed is found in:
c:/.../project2/.git/rebase-apply/patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
git am changes.patch --ignore-whitespace --no-scissors --ignore-space-change
дает первый ошибка, как указано выше: "ошибка: ошибка исправления: индекс.php: 17", но никаких конфликтных меток в .
3 ответов:
что такое патч?
патч немного больше (см. ниже), чем серия инструкций: "добавьте это здесь", "удалите это там", "измените эту третью вещь на четвертую". Это почему git говорит вам:
The copy of the patch that failed is found in: c:/.../project2/.git/rebase-apply/patchвы можете открыть этот патч в своем любимом средстве просмотра или редакторе, открыть файлы, которые будут изменены в вашем любимом редакторе, и "вручную применить" патч, используя what вы знаете (и git не делает), чтобы выяснить как "добавить это здесь" должно быть сделано, когда файлы, которые будут изменены, теперь выглядят мало или ничего похожего на то, что они делали, когда они были изменены ранее, с этими изменениями, доставленными вам в качестве патча.
немного
трехстороннее слияние вводит эту" немного больше "информации, чем простая "серия инструкций": она говорит вам, что оригинал версия файла была также. Если в вашем хранилище есть оригинальная версия, ваш git можете сравнить что вы сделал с файлом, к чему то патч говорит сделать с файлом.
как вы видели выше, если вы запрашиваете трехстороннее слияние, git не может найти "исходную версию" в другом репозитории, поэтому он даже не может попытка трехстороннее слияние. В результате вы не получаете никаких маркеров конфликта, и вы должны сделайте патч-приложение вручную.
используя
--rejectкогда вы должны применить патч вручную, все еще возможно, что git может применить большинство патча для вас автоматически и оставить только несколько частей к сущности с возможностью рассуждать о коде (или что бы это ни было, что нуждается в исправлении). Добавление
--rejectговорит git, чтобы сделать это, и оставить "неприменимые" части патча в файлах отклонения. если вы используете эту опцию, вы все равно должны вручную применить каждый не патч, и выяснить, что делать с отказом участки.после того как вы сделали необходимые изменения, можно
git addизмененные файлы и использоватьgit am --continueчтобы сказать git, чтобы зафиксировать изменения и перейти к следующему патчу.что делать, если нечего делать?
поскольку у нас нет вашего кода, я не могу сказать, так ли это, но иногда вы заканчиваете с одним из патчей, говорящих вещи, которые составляют, например, "исправить написание слова в строке 42", когда написание уже было зафиксированный.
в данном конкретном случае вы, посмотрев на патч и текущий код, должны сказать себе: "Ага,этой патч должен быть полностью пропущен!"Вот когда вы используете другой совет git уже напечатанный:
If you prefer to skip this patch, run "git am --skip" instead.если вы запустите
git am --skip, git пропустит этот патч, так что если в почтовом ящике было пять патчей, он в конечном итоге добавит только четыре коммита вместо пяти (или три вместо пяти, Если вы пропустить два раза, и так далее).
git format-patchтакже-Bфлаг.описание в man-странице оставляет желать лучшего, но на простом языке это пороговый формат-патч будет соблюдать, прежде чем делать полную перезапись файла (путем одного удаления всего старого, а затем одной вставки всего нового).
Это оказалось очень полезным для меня, когда ручное редактирование было слишком громоздким, и источник был более авторитетным, чем мой назначение.
пример:
git format-patch -B10% --stdout my_tag_name > big_patch.patch git am -3 -i < big_patch.patch
У меня была эта ошибка, удалось преодолеть ее с помощью :
patch -p1 < example.patchЯ взял его отсюда: https://www.drupal.org/node/1129120
Comments