Подтвердить что ты не робот

Git am error: "patch не применяется"

Я пытаюсь переместить несколько коммитов из одного проекта во второй, аналогичный, используя 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".

Итак, я открыл index.php, но там ничего не изменилось. Я предполагаю, что некоторые знаки >>>>>>> и т.д., Например, при разрешении конфликта слияния, но конфликт не был отмечен в файле. 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

дает первую ошибку, как указано выше: "error: patch failed: index.php: 17", но никаких пометок конфликта в index.php не было добавлено.

4b9b3361

Ответ 1

Что такое патч?

Патч немного больше (см. ниже), чем ряд инструкций: "добавьте это здесь", "удалите это", "измените эту третью вещь на четвертую". Вот почему git сообщает вам:

The copy of the patch that failed is found in:
c:/.../project2/.git/rebase-apply/patch

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

Ответ 2

git format-patch также имеет флаг -B.

Описание в man-странице оставляет желать лучшего, но на простом языке он будет соблюдать пороговый формат-патч перед выполнением полной перезаписывания файла (одним удалением всего старого, за которым следует единственное вложение всего нового).

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

Пример:

git format-patch -B10% --stdout my_tag_name > big_patch.patch
git am -3 -i < big_patch.patch

Ответ 3

У меня была эта ошибка, я смог ее преодолеть с помощью: patch -p1 < example.patch

Я взял это отсюда: https://www.drupal.org/node/1129120

Ответ 4

Если бы несколько модулей пожаловаться на патч не применяется. Одна вещь, которую я упустил, состояла в том, что ветки стали несвежими. После того, как git merge master сгенерировал файлы патчей с помощью git diff master BRANCH > file.patch. Переходя на ванильную ветку удалось применить патч с помощью git apply file.patch

Ответ 5

Я столкнулся с той же ошибкой. Я вернул версию коммита при создании патча. это сработало, так как ранее патч был в обратном порядке.

[mrdubey @SNF] $ git log 65f1d63 commit 65f1d6396315853f2b7070e0e6d99b116ba2b018 Автор: Дубей Мритунджайкумар

Дата: вт 22 января 12:10:50 2019 +0530

commit e377ab50081e3a8515a75a3f757d7c5c98a975c6 Автор: Dubey Mritunjaykumar Дата: понедельник, 21 января 23:05:48 2019 +0530

Используемая ранее запятая: git diff new_commit_id..prev_commit_id> 1 diff

Ошибка: исправление не удалось: имя файла: 40

рабочий один: git diff prev_commit_id..latest_commit_id> 1.diff