2009-02-05 2 views
122

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

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

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

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

+0

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

+2

Ничего себе, вы правы, короткий ответ по-прежнему нет - по крайней мере, в WinMerge. Запрос функции на WinMerge здесь https://sourceforge.net/tracker/index.php?func=detail&aid=695741&group_id=13216&atid=363216 – KCD

ответ

8

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

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

Удачи.

+7

Это не помогает. Целевые файлы не выходили из архива SVN. (См. Редактирование оригинального сообщения.) –

0

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

У меня, однако, были проблемы в прошлом с применением патчей, содержащих новые файлы, или которые связаны с переименованием файлов. Какой бы алгоритм не использовал Tortoise для этого, похоже, не очень хорошо справляется с этими сценариями. Unicode может дать вам аналогичные проблемы.

1

Патч сообщает, к какому файлу относится. Заголовок должен быть чем-то вроде (посмотреть его в блокноте или текстовый редактор избр):

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

В случае Subversion патча, вы бы номера ревизий, а также (так как имена файлов совпадают) ,

GNU patch позволит вам переопределить эти имена, но я не знаю каких-либо инструментов графического интерфейса, чтобы сделать то же самое. Я бы проверил с различными программами diff, но, похоже, WinMerge не поддерживает применение патчей.

+0

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

+0

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

+1

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

3

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

Вы можете установить Cygwin, а затем использовать в командной строке патч инструмент для применения патча. См. Также this Unix man page, который относится к patch.

+4

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

+0

У вас там есть точка ... –

15

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

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

+0

Это сработало для меня :), ура! –

+0

Ну положить. Не удалось бы выяснить проблему завершения линии без этого комментария. – Bryan

+0

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

2

Похоже, что TortoiseSVN (TortoiseMerge) requires the line 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) 
19

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

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

+21

AFAIK это не может использовать патч для файла без версии. – pihentagy

+0

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

+0

прочее kinda хочет: S. – UmNyobe

29

Применить заплатку

С TortoiseMerge:

  1. Найти и открыть существующий каталог репо SVN
  2. Создать новую папку с именем "слияния", если она не существует уже
  3. Скопируйте файл, на который вы хотите применить файл .patch.
  4. ADD и COMMIT для svn rep ository, прежде чем перейти к следующему шагу
  5. Щелкните правой кнопкой мыши по объему и выберите Применить патч ...
  6. Дважды щелкните файл из списка
  7. Модифицированная файл с дифф отображается на правой панели
  8. Нажмите на этой панели и ударил Сохранить или экспорта с File-> Save As ...

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

Скриншот WinMerge GUI: Screeny

+0

@WarrenP: да, это объясняет, как применить патч, используя TortoiseMerge. –

+4

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

+9

@SheriffMd Не получаете ли вы ошибку «D: \ Folder не рабочая копия»? – onmyway133

0

У вас есть два монитора? У меня была такая же проблема с TortoiseMerge, и я понял, что когда я отключил один из мониторов, появилось небольшое окно с файлом. Надеюсь, это вам поможет.

15

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

UPDATE: Должна быть удобнее использовать его, если у вас установлен Python.

pip install patch 
python -m patch 
+1

Я использую это много. Спасибо @techtonik. Любые новости о работе с Python3? – pelson

+0

@pelson 1.16+ должен теперь работать на Python 3. –

+0

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

7

Вы можете использовать this Win32 родной порт утилиты патч.

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

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

patch.exe -i <patchfile> 

Получить дополнительную помощь:

patch.exe --help 
+4

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

+2

Исполнение патча также можно найти в комплекте Git для Windows. – Snicksie

+5

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

1

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

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

+0

Именно то, что я искал! Мне было интересно, как избежать фиксации. – Keshav

1

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

0

Если вы получаете «не рабочая копия» сообщение об ошибке, то попробуйте выбрать каталог из диалогового окна TortoiseMerge, который является рабочим каталогом SVN.

1

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

  • Выберите меню Файл ->New Project
  • В появившемся диалоговом окне, сделать его проект Java Application. Дайте ему имя в диалоговом окне и нажмите Отделка.
  • Щелкните правой кнопкой мыши имя проекта и выберите Свойства из контекстного меню
  • В появившемся диалоговом окне выберите Источники и добавьте Исходников. Перейдите к источнику Java.

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

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

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

0

A BusyBox Порт для Windows имеет команду diff и patch, но поддерживает только унифицированный формат.

0

Я уже использую BeyondCompare (коммерческий) для разностей и слияний, а этот инструмент также has the capability для создания, просмотра и применения патчей.

2

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

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

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

+0

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

0

Я использую MSYS2 из http://www.msys2.org/

Он предоставляет множество утилит, как patch, which, git, tree, и многое другое.

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

pacman -S patch 
+0

Это просто запутанный способ установки инструмента командной строки. Я подозреваю, что вы только прочитали название вопроса, а не вопрос. :) –

0

Просто используйте:

patch -p0 < path-file.patch 

запомнить выполнить эту команду только из папке, где был создан патч.

Смежные вопросы