Мерзавец: патч не применяется

У меня есть определенный патч, который называется my_pcc_branch.patch.

Когда я пытаюсь применить его, я получаю следующее сообщение:

$ git apply --check my_pcc_branch.patch
warning: src/main/java/.../AbstractedPanel.java has type 100644, expected 100755
error: patch failed: src/main/java/.../AbstractedPanel.java:13
error: src/main/java/.../AbstractedPanel.java: patch does not apply

Что это значит?

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

15 ответов

Решение

Йоханнес Сикст из списка рассылки msysgit@googlegroups.com предложил использовать следующие аргументы командной строки:

git apply --ignore-space-change --ignore-whitespace mychanges.patch

Это решило мою проблему.

git apply --reject --whitespace=fix mychanges.patch работал на меня.

Когда ничего не помогает, попробуйте git apply "s --3way вариант.

git apply --3way patchFile.patch

--3way
Когда исправление не применяется корректно, используйте трехстороннее объединение, если исправление записывает идентификаторы больших двоичных объектов, к которым он должен применяться, и у нас есть эти доступные локальные большие двоичные объекты, возможно оставляя маркеры конфликта в файлах в рабочем дереве для пользователя, чтобы решить. Этот параметр подразумевает параметр --index и несовместим с параметрами --reject и --cached.

Типичный случай неудачи применяет как можно большую часть патча и оставляет вам конфликты для работы в git, как вы обычно это делаете. Вероятно, на один шаг легче, чем reject альтернатива.

Эта команда будет применять патч, не устраняя его, оставляя плохие файлы как *.rej:

git apply --reject --whitespace=fix mypath.patch

Вы просто должны решить их. После разрешения выполните:

git -am resolved

Попробуйте использовать решение, предлагаемое здесь: https://www.drupal.org/node/1129120

patch -p1 < example.patch

Это помогло мне.

Это происходит, когда вы смешиваете git-клиенты UNIX и Windows, потому что в действительности у Windows нет понятия "х", поэтому вы можете получить rw-r--r-- (0644) файл под Windows "продвигается" слоем msys POSIX, чтобы быть rwx-r-xr-x (0755). git считает, что разница в режиме в основном совпадает с текстовой разницей в файле, поэтому ваш патч не применяется напрямую. Я думаю, что ваш единственный хороший вариант здесь это установить core.filemode в false (с помощью git-config).

Вот проблема msysgit с некоторой связанной информацией: https://web.archive.org/web/20131203192656/http://code.google.com/p/msysgit/issues/detail?id=164 (перенаправлена ​​в копию archive.org от 3 декабря 2013 г.)

Просто используйте git apply -v example.patchузнать причины «патч не применяется». И тогда вы можете исправить их по одному.

В моем случае я был достаточно глуп, чтобы сначала создать файл патча некорректно, на самом деле неправильно. Я закончил с точно такими же сообщениями об ошибках.

Если вы на мастере и делаете git diff branch-name > branch-name.patch, он пытается удалить все добавления, которые вы хотите выполнить, и наоборот (что было невозможно для git, поскольку, очевидно, никогда не выполненные добавления не могут быть удалены).

Поэтому убедитесь, что вы выезжаете в свою ветку и выполняете git diff master > branch-name.patch

git apply --reverse --reject example.patch

Когда вы создали файл патча с обратными именами веток:

т.е. git diff feature_branch..master вместо git diff master..feature_branch

Я нашел эту ссылку

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

git fsck --full
git reflog expire --expire=now --all
git gc --prune=now

Если патч применяется только частично, а не весь патч. При применении патча убедитесь, что вы находитесь в правильном каталоге.

Например, я создал файл патча в папке родительского проекта, содержащий файл. Однако я пытался применить патч на более низком уровне. Изменения применялись только на этом уровне проекта.

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

Моя проблема в том, что я сбежал git diff, затем побежал git reset --hard HEAD, затем понял, что хочу отменить, поэтому я попытался скопировать вывод из git diff в файл и используя git apply, но я получил ошибку "патч не применяется". После перехода наpatchи пытаясь его использовать, я понял, что по какой-то причине фрагмент diff был повторен, и после удаления дубликата,patch (и предположительно также git apply) работал.

Убедитесь, что вы:

  1. Запуск команды из корня репозитория (странно, но для меня это было единственное правильное решение)
  2. Ты бегаешьgit apply без --checkвариант (в этом случае выполняется только проверка , но сам патч не применяется )

Надеюсь, это поможет!

То, что я искал, точно не указано здесь, в SO, я пишу для других, которые могут искать подобное. У меня возникла проблема с удалением одного файла (присутствующего в старом репо) из репо. И когда я применяю патч, он терпит неудачу, поскольку не может найти файл, который нужно применить. (так что в моем случае git patch не работает, если файл был удален) '#git apply --reject' определенно дал представление, но не совсем помогло мне исправить. Я не мог использовать покачивание, поскольку оно недоступно для наших серверов сборки. В моем случае я справился с этой проблемой, удалив запись `` файл, который был удален в репо '' из файла патча, который я пытался применить, поэтому все остальные изменения были применены без проблем (с использованием трехстороннего слияния, избегая ошибки пробелов), а затем вручную объединить содержимое удаленного файла туда, куда он был перемещен.

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