2011-01-22 3 views
164

У меня есть определенный патч с именем my_pcc_branch.patch.git: 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 

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

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

+0

Есть ли файлы AbstractedPanel.java.rej, лежащие вокруг? Обычно это означает, что линейный бот изменяется как в исходном, так и в патче (здесь, похоже, влияет строка 13). – Rudi

+0

Нет, я не нашел никаких файлов * .rej. –

ответ

231

Johannes Sixt из списка рассылки [email protected] предложил использовать следующие аргументы командной строки:

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

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

+1

Спасибо! Просто добавил псевдоним для этого. :) –

+22

Может ли кто-нибудь помочь мне и объяснить, почему это работает? Другой ответ не сработал для меня, и у меня была такая же проблема, как и то, что описывает вопрос. Что атрибуты файла связаны с игнорированием пробелов? – skrebbel

+0

Использование windows powershell Патч, выполненный с использованием git diff, был успешно применен следующим образом: git diff HEAD..613fee - myfile.xml | git apply --ignore-space-change --ignore-whitespace, тогда как сначала сохранение diff-вывода в файл не работает, в случае, если кто-то сталкивается с той же проблемой – tjb

10

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

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

+2

Я попытался запустить команду «git config core.filemode false», но это не помогло - я все равно получаю то же сообщение. –

+0

Предполагая, что у вас нет неотправленных изменений в вашем дереве, попробуйте 'git reset --hard HEAD', чтобы заставить git переустановить ваши файлы с новой действующей опцией. –

+0

Просто попробовал выполнить «git reset --hard HEAD». Это было успешно (я увидел сообщение «HEAD сейчас ...»), но проблема с «git apply» сохраняется. –

159

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

+4

Это на самом деле работало лучше для меня, потому что это не полностью изменило мой файл. –

+3

Это замечательно. Просто отвергает то, что он не может решить сам, и вы можете просто изменить отклоненные файлы вручную. – Dennis

+0

patch -p1 .orig и .rej, и вы можете применять изменения вручную. Я предполагаю, что git apply --reject делает то же самое, и - whitespace = fix волшебным образом лучше. – gaoithe

33

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

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

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

git -am resolved 
+5

Как решить '* .rej' - все, что я могу найти, - внести изменения вручную в исходный файл и удалить эти файлы .rej. Любым другим путем ? –

+1

@coding_idiot Как обычно, просто проверьте файлы .rej, сравните их с конфликтующими файлами и, наконец, добавьте фиксированные файлы в индекс (с помощью «git add FIXED_FILES») –

+0

Вы имели в виду git _commit_ -am resolved? – Zonko

1

Когда все остальное не работает, попробуйте git apply's --3way option.

git apply --3way patchFile.patch

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

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