Як застосувати диференційний патч для Windows?


136

Існує безліч програм, які можуть створити різний патч, але у мене є час, намагаючись застосувати його. Я намагаюся поширити патч, і у мене з’явилося запитання від користувача про те, як його застосувати. Тож я спробував розібратися в цьому самостійно і з’ясував, що у мене немає поняття, і більшість інструментів, які я можу знайти, - це командний рядок. (Я можу впоратися з командним рядком, але багато людей втратили б без приємного, доброзичливого графічного інтерфейсу. Тому це не корисно для цієї мети.)

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

Тому я спробував вдарити Open. Він має два варіанти: об'єднати та застосувати уніфікований розл. (На щастя, патч знаходиться в уніфікованому форматі diff.) Але параметр застосування просто не працює: він запитує патч та папку. Якось забув попросити файл, щоб застосувати патч! Тож TortoiseSVN просто не працює. Чи є утиліта на основі графічного інтерфейсу Windows, яка візьме виправлення та файл та правильно його застосує?

РЕДАКТУВАННЯ: Подивившись відповіді на даний момент, схоже, що Черепаха зробить це правильно лише в тому випадку, коли це вже файл, який вже розроблений. Тут це не так. Мені потрібно мати можливість застосувати виправлення до файлу, який не вийшов із сховища SVN. Я просто спробував використати черепаху, тому що я знаю, що SVN використовує розрізнення і повинен знати, як створити їх і застосувати.


Відповідь WinMerge прозвучала добре, але лише пояснює, як зробити патч, а не як його застосувати. Наскільки я знаю, TortoiseHG має чудовий спосіб застосувати виправлення, але лише до файлів, які перебувають у hg-репо. Якщо зовнішній SVN TortoiseDiff не може цього зробити, мені цікаво, чи зможе будь-який інструмент GUI.
Warren P

3
Вау, ви праві, короткої відповіді все ще немає - принаймні в WinMerge. Запит на функцію WinMerge тут sourceforge.net/tracker/…
KCD

Відповіді:


32

Застосувати Patch

З TortoiseMerge:

  1. Знайдіть і відкрийте існуючий каталог репортажів SVN
  2. Створіть новий каталог з назвою "зливається", якщо він вже не існує
  3. Скопіюйте файл, до якого потрібно застосувати .patch файл
  4. ДОДАТИ та КОМІТУЙТЕ до сховища svn, перш ніж перейти до наступного кроку
  5. Клацніть правою кнопкою миші на об'єднанні та оберіть Застосувати патч ...
  6. Двічі клацніть файл зі списку
  7. Виправлений файл з diff відображається на правій панелі
  8. Клацніть на цій панелі та натисніть Зберегти або експортувати за допомогою Файл-> Зберегти як ...

Альтернативний варіант екрану, якщо ви відкриєте з TortoiseMerge. На екрані нижче каталог посилається на каталог "злиття", згаданий на етапі 2 вище: Екранний

Скріншот графічного інтерфейсу WinMerge: Екранний


@WarrenP: так, це пояснює, як застосувати патч за допомогою TortoiseMerge
Walter Stabosz

4
Мій коментар мав сенс перед редагуванням, і він більше не має сенсу після правок. Ви ще розгублені? Згадана вище часова марка редагування (24 березня '11) є невірною, оскільки ОП знову редагувала свою відповідь з жовтня 2011 року. Я думаю, що мітка часу на мій коментар також неправильна.
Warren P

9
@SheriffMd Ви не отримуєте помилку "D: \ Папка не є робочою копією"?
onmyway133

1
@SheriffMd Я також отримую повідомлення "папка ... це не робоча копія" - так, як можна використовувати злиття черепахи, щоб застосувати патч до неперевершеного файлу?
Петро Т.

1
@ onmyway133, я перефразував кроки. Перегляньте крок 2 та крок 4. Ви не отримаєте повідомлення про помилку "не робоча копія".
Шериф Md

21

Я зробив чистий інструмент Python саме для цього. Він має передбачувану поведінку між платформами. Хоча він не створює нових файлів (на момент написання цього запису) і не має GUI, він може використовуватися як бібліотека для створення графічного інструменту.

ОНОВЛЕННЯ : Користуватися ним слід зручніше, якщо у вас встановлений Python.

pip install patch
python -m patch

1
Я цим багато користуюся. Дякую @techtonik. Будь-які новини про те, як працювати з Python3?
pelson

Запустіть патч установки pip з правами адміністрації, щоб переконатися, що він працює.
Vertexwahn

@Vertexwahn це на Linux?
anatoly techtonik

Python працює скрізь - я протестував його з Windows 10
Vertexwahn,

Працював у Windows 10, коли git-патч не працював. Дякую!
sqrl0

19

TortoiseMerge - це окрема утиліта, яка постачається в комплекті з TortoiseSVN.

Його також можна завантажити окремо в архіві TortoiseDiff.zip . Це дозволить вам застосовувати уніфіковані розрізниння до файлів, що не мають версії.


21
AFAIK це не може застосувати патч до неперевершеного файлу.
pihentagy

У мене не виникло проблем із застосуванням його до неперевершеного файлу.
Пол Шеннон

інші хочуть: S.
UmNyobe

1
Версія 1.8.7 дає помилку з приводу того, що мета не розглядається.
Нік Вестгейт

15

Я знаю, ви сказали, що віддаєте перевагу графічний інтерфейс, але інструменти командного рядка добре виконають роботу. Див. GnuWin для порту unix-інструментів для Windows. Очевидно, вам знадобиться команда виправлення ;-)

Однак у вас можуть виникнути проблеми з припиненням лінії. Порт GnuWin припускає, що патчфіл має закінчення лінії стилю DOS (CR / LF). Спробуйте відкрити патч-файл у досить розумному редакторі, і він перетворить його на вас.


Добре кажучи. Не вдалося б вирішити проблему припинення лінії без цього коментаря.
Брайан

Ще один спосіб розібратися з закінченнями рядків - додати в командний рядок опцію "--binary".
BeReal82

4
Це те, що вивело мене на правильний шлях. Однак для роботи під керуванням Windows 7 або новішої версії вам потрібно оновити маніфест patch.exe, щоб уникнути появи спливаючих вікон UAC кожного разу. Дивіться на цій сторінці інформацію про те, як: math.nist.gov/oommf/software-patchsets/patch_on_Windows7.html
Anttu

1
Навіть із виправленнями UAC, версія GnuWin виправлення змінює налаштування безпеки файлів. Збірка, що постачається з git, не страждає ні від однієї з проблем.
Artfunkel

8

У TortoiseSVN нанесення патчів працює. Вам потрібно застосувати виправлення до тієї самої директорії, з якої він створений . Це завжди важливо пам’ятати. Отже, ось як це зробити в TortoiseSVN:

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

Удачі.


8
Це не допомагає. Файли призначення не виходили з архіву SVN. (Дивіться правки до оригінальної публікації.)
Мейсон Уілер

8

Утиліта patch.exe з установки Git працює в Windows 10.

Встановіть Git для Windows, а потім скористайтеся"C:\Program Files\Git\usr\bin\patch.exe" командою для застосування виправлення.

Якщо будь-яке повідомлення про помилку, наприклад Hunk #1 FAILED at 1 (different line endings)., було отримано на виході під час застосування патчу, спробуйте додати -l(тобто ярлик для --ignore-whitespace) або --binaryперемикачі до командного рядка.


Це питання здебільшого стосується інструмента GUI для випадкових користувачів, які не знайомі з типовими інструментами командного рядка. Ваша відповідь була б кориснішою, якби ви принаймні навели кілька повних зразкових команд як приклад.
Альваро Гонсалес

Працює з композитором у Windows 10.
ecdani

7

Ви можете використовувати це рідний порт Win32 утиліти для виправлення.

Він поставляється разом з більшим вибором інших утиліт, на відміну від Cygwin і подібних, йому не потрібні DLL або подібні. Просто виберіть свій крихітний виконаний файл на вибір і зберігайте його там, де ви хочете.

Просте використання:

patch.exe -i <patchfile>

Отримайте додаткову допомогу:

patch.exe --help

4
У мене проблеми з цим у Windows 7: воно відкриває нове вікно CMD і вимагає адміністративних привілеїв при спробі запуску patch.exe.
Рой Тінкер

3
Виконаний патч можна також знайти в пакеті Git для Windows.
Snicksie

6
Якщо у вас виникли проблеми із запуском patch.exe, ви можете перейменувати його на все, що не включає patch. Windows вважає всіх людей із словом patchпідозрюваними.
wbond

2

РЕДАКТУВАННЯ: Подивившись відповіді на даний момент, схоже, що Черепаха зробить це правильно лише в тому випадку, коли це вже файл, який вже розроблений. Тут це не так. Мені потрібно мати можливість застосувати виправлення до файлу, який не вийшов із сховища SVN. Я просто спробував використовувати Черепаху, тому що я випадково знаю, що SVN використовує розрізнення і повинен знати, як створити їх і застосувати.

Ви можете встановити Cygwin , а потім застосувати патч командного рядка , щоб застосувати патч. Дивіться також цю man-сторінку Unix , яка стосується патча .


4
Так, я міг би. Насправді у мене є Цигвін. Можливо, я міг би також зробити ваше рішення спрацьованим. Я не збираюсь ставити своїх користувачів через це. Ви маєте ідею, скільки користувачів Windows за ці дні навіть не знають, що таке командний рядок? : P
Мейсон Уілер

2

Здається, TortoiseSVN (TortoiseMerge) вимагає рядкаIndex: foobar.py у файлі diff / patch. Це те, що мені потрібно було зробити, щоб робота з файлом виправлення, що не є TortoiseSVN, працювала правою кнопкою миші TortoiseSVN правою кнопкою миші Застосувати патч командою команду .

Перед:

--- foobar.py.org   Sat May 08 16:00:56 2010
+++ foobar.py   Sat May 08 15:47:48 2010

Після:

Index: foobar.py
===================================================================
--- foobar.py
+++ foobar.py   (working copy)

Або якщо ви знаєте конкретну редакцію, з якої працював ваш дописувач:

Index: foobar.py
===================================================================
--- foobar.py   (revision 1157)
+++ foobar.py   (working copy)

2

Я використовую MSYS2 від http://www.msys2.org/

Він надає безліч утиліт , як patch, which, git,tree і багато іншого.

Після установки MSYS2 просто запустіть менеджер пакунків, щоб встановити patch:

pacman -S patch

Це лише звичний спосіб встановити інструмент командного рядка. Я підозрюю, що ви читаєте лише назву питання, а не саме питання. :)
Альваро Гонсалес

1

Патч повідомляє, до якого файлу слід застосувати. Заголовок повинен бути чимось на зразок (переглянути його в Блокноті або у вашому текстовому редакторі):

--- Folder/old_file
+++ Folder/new_file

У випадку з патчем Subversion у вас також будуть номери ревізії (оскільки імена файлів однакові).

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


Ні, нічого подібного немає вгорі мого пластиру. Ви хочете сказати, що ім'я файлу та шлях повинні бути включені до самого розрізнення? Хто це придумав? Що ви повинні зробити, якщо ви хочете поширити Dif комусь, хто може встановити речі в інших папках?!?
Мейсон Уілер

Верхня частина патча починається так: --- / +++ / @@ -6,12 +6,12 @@ Ніяких імен файлів або чогось іншого. Як має працювати вбудований шлях? Що робити, якщо я створив патч на XP і хтось намагається використовувати його на Vista (або навпаки), і шлях до папки «Документи» відрізняється?
Мейсон Уілер

1
Імена файлів відносяться до кореневого каталогу сховища, тому відмінності в структурі папок XP / Vista не мають значення. І причиною наявності в патчі імен файлів є те, що більшість патчів впливають на кілька файлів.
David Z

Я бачу. Гаразд, це має більше сенсу. Дякую, що вияснили це, Девіде!
Мейсон Уілер

1

Eclipse має бути в змозі це зробити, перейти в TeamSynchronize перспективу, а потім у Project-> Apply patch


1

Для проектів Java я використовував NetBeans для застосування файлів патчів. Якщо код Java, який ви виправляєте, ще не є проектом NetBeans, створіть для нього проект. Щоб створити новий проект:

  • Виберіть меню Файл -> Новий проект
  • У діалоговому вікні, що виходить, зробіть це проект програми Java . Дайте ім’я в діалоговому вікні та натисніть Finish.
  • Клацніть правою кнопкою миші назву вашого проекту та виберіть Властивості у контекстному меню
  • У діалоговому вікні, що виходить, виберіть Джерела та додайте папку з джерелом . Перейдіть до свого джерела Java.

Тепер, коли у вас є проект, застосуйте виправлення:

  • Виділіть проект, щоб вибрати його
  • У головному меню виберіть меню Інструменти -> Застосувати різницю
  • У діалоговому вікні, що виходить, перейдіть до файлу патча, виберіть його та натисніть кнопку Патч.

Це воно. Ваш патч слід застосувати, і ви повинні побачити різне вікно, де відображаються зміни.


1

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


1

Якщо ви використовуєте Mercurial , це робиться за допомогою "імпорту". Отже, у командному рядку, hg importкоманді або (ви можете знайти--no-commit корисна опція), або "Репозиторій" => "Імпорт ..." в Hg Workbench.

Зауважте, що вони зафіксують зміни за замовчуванням; ви можете уникнути цього, використовуючи hg import --no-commitопцію, якщо використовуєте командний рядок або якщо ви використовували Hg Workbench, можливо, вам буде корисно видавати hg rollbackпісля об'єднання.


Саме те, що я шукав! Мені було цікаво, як уникнути вчинення.
Кешав

0

Застосовуючи виправлення за допомогою TortoiseSVN, я зазвичай зберігаю шлях у корені перевіреного сховища. Потім ви зможете правою кнопкою миші натиснути патч, перейдіть до меню TortoiseSVN і натисніть ApplyPatch. ApplyPatch повинен автоматично визначити, на якому рівні в ієрархії каталогів створений патч.

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


0

У вас є два монітори? У мене була та сама проблема з TortoiseMerge, і я зрозумів, що коли я відключив один із моніторів, з'явилося віконце зі списком файлів. Сподіваюся, це вам допоможе.


0

Якщо ви отримуєте повідомлення про помилку "Не працює копія", спробуйте вибрати каталог із діалогового вікна TortoiseMerge, який є робочою директорією SVN.


0

BusyBox порт для Windows , має як команду порівняння і патч, але вони підтримують тільки уніфікований формат.


0

Просто використовуйте:

patch -p0 < path-file.patch

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

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