Мерзавец: патч не применяется
У меня есть определенный патч, который называется 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
) работал.
Убедитесь, что вы:
- Запуск команды из корня репозитория (странно, но для меня это было единственное правильное решение)
- Ты бегаешь
git apply
без--check
вариант (в этом случае выполняется только проверка , но сам патч не применяется )
Надеюсь, это поможет!
То, что я искал, точно не указано здесь, в SO, я пишу для других, которые могут искать подобное. У меня возникла проблема с удалением одного файла (присутствующего в старом репо) из репо. И когда я применяю патч, он терпит неудачу, поскольку не может найти файл, который нужно применить. (так что в моем случае git patch не работает, если файл был удален) '#git apply --reject' определенно дал представление, но не совсем помогло мне исправить. Я не мог использовать покачивание, поскольку оно недоступно для наших серверов сборки. В моем случае я справился с этой проблемой, удалив запись `` файл, который был удален в репо '' из файла патча, который я пытался применить, поэтому все остальные изменения были применены без проблем (с использованием трехстороннего слияния, избегая ошибки пробелов), а затем вручную объединить содержимое удаленного файла туда, куда он был перемещен.