git: патч не застосовується


289

У мене є певний патч, який називається 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

Що це означає?

Як я можу виправити цю проблему?


Чи лежать навколо файли AbstractedPanel.java.rej? Типово це означає, що бот рядка змінився як у вихідному, так і в патчі (тут, здається, це впливає рядок 13).
Руді

Ні, я не знайшов файлів * .rej.
Дмитро Писаренко

Не впевнений, чому прийнята відповідь виправить це (тому я підозріло, що це червона оселедець), але чи не has type 100644, expected 100755означає, що десь невідповідність дозволів chmod?
ruffin

Відповіді:


325

git apply --reject --whitespace=fix mychanges.patch працював на мене.

Пояснення

--rejectВаріант буде інструктувати мерзотник , щоб не зазнати невдачі , якщо він не може визначити , як застосувати патч, але замість того, щоб застосувати indivdual скибок можна застосовувати і створювати відхиляти файли ( .rej) для скнари не може застосовуватися. Wiggle може "застосувати [ці] відхилені патчі та виконувати слововідмінні розбіжності".

Крім того, --whitespace=fixпопередитимуть про помилки білого простору та спробують виправити їх, а не відмовлятись застосовувати інший застосований текст.

Обидва варіанти разом роблять застосування патчу більш надійним проти відмов, але вони вимагають додаткової уваги щодо результату.

Про всю документацію див. Https://git-scm.com/docs/git-apply .


8
Це насправді працювало для мене краще, тому що він не повністю змінив мій файл
Wayne Werner

10
Це чудово. Просто відхиляє те, що не може вирішити сам, а потім ви можете просто змінити відхилені файли вручну.
Денніс

1
патч -p1 <mychanges.patch # застосовує фрагменти змін за допомогою фрагмента. Якщо зміни не вдалося створити патч <sourcefile> .orig та <sourcefile> .rej, і ви можете застосувати зміни вручну. Я здогадуюсь, що застосувати git --reject робить те саме, а --whitespace = fix виходить магічніше.
gaoithe

7
ця команда створює .rejфайли, коли не вдається автоматично визначити, як застосувати патч. Ви можете використовувати wiggle для вирішення таких проблем.
goodniceweb

14
Ця відповідь нічого не пояснює, зокрема, в яких випадках вона буде працювати. Люди, ви справді повинні бути вимогливішими до якості відповідей, це ТАК, а не форум.
Олівер

319

Йоханнес Сікст зі списку розсилки msysgit@googlegroups.com запропонував використовувати такі аргументи командного рядка:

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

Це вирішило мою проблему.


25
Хтось може мені допомогти і пояснити, чому це працює? Інша відповідь не працювала для мене, і у мене була така ж проблема, як і те, що описує запитувач. Які атрибути файлів мають відношення до ігнорування пробілів?
skrebbel

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

2
також спробуйте -C1переключитись на застосувати, це зменшує контекст навколо доповнень, які вважаються важливими.
Амір Алі Акбарі

2
@EricWalker, магія git із CR / LF не обов'язково є поганою справою. Альтернативою може бути те, що половина ваших наборів змін складається з кожного рядка у кожному файлі, який торкнувся, змінившись від одного рядка до іншого, а фактична зміна похована десь посередині.
jwg

3
Це допомагає іноді. Але в інших випадках я все одно отримую "патч не застосовується", навіть якщо патч повинен застосовуватися без проблем.
Томас Левеск

118

Коли все інше зазнає невдачі, спробуйте git apply«s --3wayваріант .

git apply --3way patchFile.patch

--3way
Коли патч не застосовується чисто, поверніться на тристоронній злиття, якщо патч записує особу крапок, до яких належить застосувати, а у нас є ті краплі доступні локально, можливо, залишаючи маркери конфлікту у файлах у робоче дерево для вирішення користувачем. Цей параметр передбачає параметр --index і є несумісним з параметрами --reject і --cached.

Типовий випадок виходу з ладу застосовує стільки патчу, скільки він може, і залишає у вас конфлікти для роботи в git, однак ви зазвичай це робите. Напевно, на крок простіше, ніж rejectальтернатива.


2
Це відповідь, яка працювала на мене. Файл я латок не відображає зміни , які я зробив патч з (бо я видалив зміни після того, як я створив патч.)
Крістен

3
Гарне загальне рішення. 3way diff не виглядав так, як це зазвичай робить це трохи збентежене цим, але ніколи це не дало мені можливості вирішити конфлікт і отримати патч для застосування.
steinybot

8
Я думаю, це --3wayмає бути поведінка за замовчуванням. Якщо виправлення не вдається, принаймні скажіть, що не вдалося, щоб я міг його вручну виправити. git applyпросто виходить з ладу і не повідомляє, чому щось відбувається. Я навіть не міг знайти *.rejтакі файли, як hgгенерує.
Pavan Manjunath

4
Однозначно, найкраще рішення. Нехай користувач вирішує власні конфлікти!
Мош Феу

56

Ця команда застосує патч, не вирішивши його, залишивши погані файли як *.rej:

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

Ви просто повинні їх вирішити. Після вирішення запуску:

git -am resolved

7
як вирішити *.rej- все, що я можу знайти, - це внести зміни вручну у вихідний файл та видалити ці .rejфайли. Іншим способом?
coding_idiot

1
@coding_idiot Як завжди, просто перевірте файли .rej, порівняйте їх із конфліктуючими файлами та, нарешті, додайте фіксовані файли до індексу (з "git add FIXED_FILES")
Іван Ворошилін

2
@coding_idiot ви можете використати wiggle для її вирішення. Наприклад: wiggle --replace path/to/file path/to/file.rej. Ця команда застосовуватиме зміни від .rejфайлу до оригінального файлу. Також він створює копію оригінального файлу, наприклад path/to/file.porig. Будь ласка, перегляньте документацію, щоб отримати більше інформації про wiggle
goodniceweb

22

Спробуйте скористатися запропонованим тут рішенням: https://www.drupal.org/node/1129120

patch -p1 < example.patch

Це мені допомогло.


3
Я знаю, що ти не повинен цього робити, але ДЯКУЄМО ТАКІ МНОГО! Економили мені години. Я отримував "патч не застосовується" і всілякі помилки.
sudo rm -rf slash

@ sudorm-rfslash, чому ми не повинні цього робити і чому ти все-таки це робив?
Чорний

git: 'patch' is not a git command.ongit version 2.21.1 (Apple Git-122.3)
Шрідхар Сарнобат

16

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

Ось проблема msysgit із деякою пов’язаною інформацією: http://code.google.com/p/msysgit/isissue/detail?id=164 (перенаправлена ​​до копії archive.org 3 грудня 2013 року)


2
Я спробував запустити команду "git config core.filemode false", але це не допомогло - я все одно отримую те саме повідомлення.
Дмитро Писаренко

Якщо припустити, що у вашому дереві немає змін, спробуйте git reset --hard HEADзмусити git повторно перевірити ваші файли з новою діючою опцією.
Бен Джексон

Просто спробував виконати "git reset --hard HEAD". Це було успішним (я бачив повідомлення "HEAD зараз на ..."), але проблема з "git apply" зберігається.
Дмитро Писаренко

7

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

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

Тож переконайтеся, що ви завітали до своєї філії та виконали git diff master > branch-name.patch


3

ПОПЕРЕДЖЕННЯ: Ця команда може видалити старі втрачені комірки ТІЛЬКО. Зробіть копію всього свого сховища, перш ніж намагатися це зробити.

Я знайшов це посилання

Я не маю поняття, чому це працює, але я спробував багато робіт, і це єдиний, хто працював на мене. Якщо коротко, запустіть три команди нижче:

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

3
Це дуже небезпечна команда, яка може назавжди видалити старі втрачені комісії з рефлогу. Якщо ваше РЕПО знаходиться в хиткому стані, НЕ ЗАЯВАЙТЕ ЦЕ.
ET

0

Те, що я шукав, не є чітко вказаним тут, в SO, я пишу на користь інших, хто може шукати подібне. Я зіткнувся з проблемою, коли один файл (присутній у старому репо) був видалений у репо. І коли я застосую патч, він не вдається, оскільки не міг знайти файл, який слід застосувати. (тому мій випадок - не вдалося виправити патч git для видаленого файлу) "#git apply --reject", безумовно, дав перегляд, але не дуже вдав мене до виправлення. Я не міг використовувати wiggle, оскільки він недоступний для нас на наших серверах побудови. У моєму випадку я пережив цю проблему, видаливши запис файлу, який було видалено в репо-файлі, з файлу патча, який я спробував застосувати, тому я застосував всі інші зміни, застосовані без проблеми (використовуючи тристоронній злиття, уникаючи помилки пробілу), а потім об'єднання файлу видалено вручну, куди його перемістили.


0

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.