Как я могу применить diff-патч в Windows?


136

Существует множество программ, которые могут создать патч для различий, но у меня есть куча времени, чтобы применить его. Я пытаюсь распространить патч, и у меня есть вопрос от пользователя о том, как его применить. Поэтому я попытался выяснить это самостоятельно и обнаружил, что понятия не имею, и большинство инструментов, которые я могу найти, это командная строка. (Я могу справиться с командной строкой, но многие люди будут потеряны без хорошего, дружественного графического интерфейса. Так что это не годится для этой цели.)

Я пытался использовать TortoiseSVN. У меня есть патч, который я хотел бы применить. Я щелкаю правой кнопкой мыши на патче, и в подменю TortoiseSVN есть опция «Применить патч». Все, что он делает, это поднимает пустое окно.

Поэтому я попытался нажать Open. У него есть два варианта: объединить и применить унифицированный diff. (К счастью, патч находится в унифицированном формате diff.) Но опция apply просто не работает: она запрашивает патч и папку. Каким-то образом он забыл попросить файл для применения патча! Так что TortoiseSVN просто не работает. Существует ли утилита на базе графического интерфейса Windows, которая возьмет исправление и файл и правильно его применяет?

РЕДАКТИРОВАТЬ: Глядя на ответы до сих пор, кажется, что черепаха будет делать это правильно, только если это файл, который уже версирован. Это не тот случай, здесь. Мне нужно иметь возможность применить патч к файлу, который не вышел из репозитория SVN. Я только что попробовал использовать Tortoise, потому что случайно узнал, что SVN использует diff и должен знать, как их создавать и применять.


Ответ WinMerge звучит хорошо, но объясняет только, как сделать патч, а не как его применить. Насколько мне известно, TortoiseHG имеет отличный способ применять патчи, но только к файлам, которые находятся в репозитории hg. Если внешний SVN TortoiseDiff не может это сделать, мне интересно, может ли какой-либо инструмент с графическим интерфейсом.
Уоррен П

3
Ух ты, ты прав, краткого ответа все еще нет - по крайней мере, в WinMerge. Запрос о функции на WinMerge здесь sourceforge.net/tracker/…
KCD

Ответы:


32

Применить патч

С TortoiseMerge:

  1. Найдите и откройте существующий каталог репозитория SVN
  2. Создайте новый каталог с именем «слияния», если он еще не существует
  3. Скопируйте файл, к которому вы хотите применить файл .patch
  4. ДОБАВЬТЕ и УСТАНОВИТЕ в хранилище SVN, прежде чем перейти к следующему шагу
  5. Щелкните правой кнопкой мыши по слиянию и выберите Применить патч ...
  6. Дважды щелкните файл из списка
  7. Исправленный файл с diff отображается на правой панели
  8. Нажмите на эту панель и нажмите Сохранить или экспортировать с помощью меню Файл-> Сохранить как ...

Альтернативный скрин, если вы открываете из TortoiseMerge. На скриншоте ниже каталог относится к каталогу «слияний», упомянутому на шаге 2 выше: Screeny

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


@WarrenP: да, это объясняет, как применить патч с помощью TortoiseMerge
Уолтер Стабош

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

9
@SheriffMd Разве вы не получаете сообщение об ошибке «D: \ Папка не рабочая копия»?
onmyway133

1
@SheriffMd Я также получаю сообщение «папка ... не рабочая копия» - так, как можно использовать объединение черепах, чтобы применить исправление к файлу без версии?
Питер Т.

1
@ onmyway133, я перефразировал шаги. См. Шаг 2 и Шаг 4. Вы не получите сообщение об ошибке «Не рабочая копия».
Шериф Md

21

Я сделал чистый инструмент Python только для этого. У него предсказуемое кроссплатформенное поведение. Хотя он не создает новые файлы (на момент написания этого) и не имеет графического интерфейса, он может использоваться в качестве библиотеки для создания графического инструмента.

ОБНОВЛЕНИЕ : это должно быть более удобным, если у вас установлен Python.

pip install patch
python -m patch

1
Я использую это много. Спасибо @techtonik. Есть новости о том, как заставить его работать с Python3?
Пельсон

Запустите pip install patch с правами администратора, чтобы убедиться, что он работает.
Vertexwahn

@ Vertexwahn это в Linux?
анатолий техтоник

Python работает везде - я тестировал его с Windows 10
Vertexwahn

Работал на Windows 10, когда git patch не работал. Спасибо!
sqrl0

19

TortoiseMerge - это отдельная утилита, которая поставляется в комплекте с TortoiseSVN.

Его также можно скачать отдельно в архиве TortoiseDiff.zip . Это позволит вам применять унифицированные различия к файлам без версий.


21
AFAIK это не может применить исправление к не версионному файлу.
pihentagy

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

другие хотят: S.
UmNyobe

1
Версия 1.8.7 выдает ошибку о том, что dest не версионируется.
Ник Вестгейт

15

Я знаю, что вы сказали, что предпочли бы графический интерфейс, но инструменты командной строки прекрасно сработают. Смотрите GnuWin для порта инструментов Unix для Windows. Вам понадобится команда patch, очевидно ;-)

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


Хорошо сказано. Без этого комментария не смог бы выяснить проблему завершения строки.
Брайан

Другой способ справиться с окончаниями строки - добавить параметр «--binary» в командную строку.
BeReal82

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

1
Даже с исправлениями UAC версия патча GnuWin портит настройки безопасности файлов. Сборка, поставляемая с git, не страдает ни от одной проблемы.
Артфункель

8

В TortoiseSVN применение исправлений работает. Вам необходимо применить патч к тому же каталогу, из которого он был создан . Всегда важно помнить об этом. Вот как вы это делаете в TortoiseSVN:

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

Удачи.


8
Это не помогает Файлы назначения не вышли из архива SVN. (См. Правку к исходному сообщению.)
Мейсон Уилер

8

Утилита patch.exe из установки Git работает в Windows 10.

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

Если какое-либо сообщение об ошибке, например a, Hunk #1 FAILED at 1 (different line endings).было получено на выходе во время применения исправления, попробуйте добавить -l(это ярлык для --ignore-whitespace) или --binaryпереключатели в командную строку.


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

Работает с композитором в Windows 10.
ecdani

7

Вы можете использовать этот собственный порт Win32 утилиты исправления.

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

Простое использование:

patch.exe -i <patchfile>

Получите больше помощи:

patch.exe --help

4
У меня проблемы с этим в Windows 7: он открывает новое окно CMD и запрашивает административные привилегии при попытке запустить patch.exe.
Рой Тинкер

3
Исполняемый файл патча также можно найти в комплекте Git для Windows.
Сникси

6
Если у вас возникли проблемы с запуском patch.exe, вы можете переименовать его во все, что не входит patch. Windows считает все exes со словом patchподозрительными.
суббота

2

РЕДАКТИРОВАТЬ: Глядя на ответы до сих пор, кажется, что черепаха будет делать это правильно, только если это файл, который уже версирован. Это не тот случай, здесь. Мне нужно иметь возможность применить патч к файлу, который не вышел из репозитория SVN. Я только что попробовал использовать Tortoise, потому что случайно узнал, что SVN использует diff и должен знать, как их создавать и применять.

Вы можете установить Cygwin , а затем использовать инструмент исправления командной строки , чтобы применить исправление. Смотрите также эту справочную страницу Unix , которая относится к патчу .


4
Да, я мог. У меня есть Cygwin, на самом деле. Я мог бы, вероятно, заставить ваше решение работать тоже. Я не собираюсь подвергать своих пользователей этому. Вы хоть представляете, сколько пользователей Windows в наши дни даже не знают, что такое командная строка? : P
Мейсон Уилер

2

Похоже, что TortoiseSVN (TortoiseMerge) требует строкиIndex: foobar.py в файле diff / patch. Это то, что мне нужно было сделать, чтобы файл исправления, не относящийся к TortoiseSVN, работал с помощью правой кнопки TortoiseSVN Apply Patch .

Перед:

--- 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 не поддерживает применение патчей.


Нет, ничего подобного наверху моего патча нет. Вы говорите, что имя файла и путь должны быть включены в сам diff? Кто это придумал? Что вы должны делать, если хотите распространять diff кому-то, у кого могут быть какие-то вещи, установленные в других папках?!?
Мейсон Уилер

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

1
Имена файлов относятся к корневому каталогу хранилища, поэтому различия в структуре папок XP / Vista не имеют значения. И причина наличия имен файлов в патче заключается в том, что большинство патчей влияют на несколько файлов.
Дэвид З

Понимаю. ОК, это имеет больше смысла. Спасибо за разъяснение, Дэвид!
Мейсон Уилер

1

Eclipse должен быть в состоянии сделать это, перейти к перспективе TeamSynchronize, а затем в Project-> Apply patch


1

Для проектов Java я использовал NetBeans для применения файлов исправлений. Если исправляемый код Java еще не является проектом NetBeans, создайте для него проект. Чтобы создать новый проект:

  • Выберите меню Файл -> Новый проект
  • В появившемся диалоговом окне сделайте его проектом Java-приложения . Дайте ему имя в диалоговом окне и нажмите Finish.
  • Щелкните правой кнопкой мыши имя вашего проекта и выберите «Свойства» в контекстном меню.
  • В появившемся диалоговом окне выберите « Источники» и добавьте « Исходную папку» . Найдите свой источник Java.

Теперь, когда у вас есть проект, примените патч:

  • Выделите свой проект, чтобы выбрать его
  • В главном меню выберите меню Инструменты -> Применить Diff Patch
  • В появившемся диалоговом окне найдите файл патча, выберите его и нажмите кнопку «Патч».

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



1

Если вы используете Mercurial , это делается через «импорт». Таким образом, в командной строке hg importкоманда или (вы можете найти эту --no-commitопцию полезной), или «Repository» => «Import ...» в Hg Workbench.

Обратите внимание, что они будут фиксировать изменения по умолчанию; Вы можете избежать этого, используя hg import --no-commitопцию, если используете командную строку, или если вы использовали Hg Workbench, может оказаться полезным выпустить hg rollbackпосле слияния.


Именно то, что я искал! Мне было интересно, как избежать коммита.
Кешав

0

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

Однако в прошлом у меня были проблемы с применением исправлений, содержащих новые файлы или переименовывающих файлы. Какой бы алгоритм ни использовала Tortoise для этого, похоже, не очень хорошо справляется с этими сценариями. 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.