Как создать патч
Перейти к содержимому

Как создать патч

  • автор:

4.4 Создание патчей

Файлы, которые добавлялись или изменялись в процессе создания порта, могут быть выявлены вызовом программы diff (1) с рекурсией, а результат работы этой программы может быть в дальнейшем передан программе patch (1) . Каждый набор патчей, который вы собираетесь применить, должен быть собран в файл с именем patch- * , где * означает порядок, в которой будут применяться патчи — это делается в алфавитном порядке , то есть сначала aa , затем ab и так далее. Если хотите, вы можете использовать имена файлов, указывающие на имена файлов, к которым применяются патчи, такие, как patch-Imakefile или patch-src-config.h. Эти файлы должны находиться в каталоге PATCHDIR, откуда они будут взяты автоматически. Все патчи должны быть сделаны относительно каталога WRKSRC (как правило, это каталог, в который распаковывается исходный архив и где будет выполняться построение). Для упрощения внесения изменений и обновлений вы должны избегать наличия более чем одного патча для одного и того же файла (например, патчей patch-aa и patch-ab, оба меняющих файл WRKSRC/foobar.c).

Не помещайте строки RCS в патчи. CVS будет изменять их при помещении файлов в дерево портов, и когда мы будем их оттуда извлекать, они будут уже другие, поэтому применение патчей окончится неудачей. Строчки RCS предваряются знаком доллара ( $ ), и обычно начинаются с $Id или $RCS .

Использование параметра рекурсии ( -r ) с командой diff (1) для генерации патчей — это хорошо, но всё же, пожалуйста, смотрите на получающиеся патчи, чтобы убедиться в отсутствии ненужного мусора. В частности, diff-разниц между двумя резервными копиями файлов, файлы Makefile, когда как порт использует Imake или GNU-версию программы configure, и так далее, не нужны, и должны быть удалены. Если вы отредактировали файл configure.in и запустили autoconf для перегенерации configure, не нужно включать файлы diff для configure (они частенько вырастают до нескольких тысяч строк!); задайте USE_AUTOCONF=yes и включите дифф-файл для configure.in.

Кроме того, если вы удаляете файл, то это можно сделать и в цели post-extract, а не внутри патча. Как только вы будете удовлетворены получающимся дифф-файлом, разбейте его на несколько по одному патчу на отдельный файл.

Prev Home Next
Модификация порта Up Конфигурирование

Use patches

Instead of committing your local changes, you can put them in a .patch file that you can apply to your sources later, send by email, and so on. Using patches is a convenient mechanism for sharing changes without checking them in a VCS repository.

Create a patch from uncommitted changes

  1. In the Local Changes view, select the file or changelist that you want to include in the patch, and choose Create Patch from Local Changes from the context menu. You can also select the changes for commit: click the arrow next to the Commit button and select Create Patch .
  2. In the dialog that opens, make sure that all the changes you want to include in the patch are selected, enter a commit comment (optionally), and click Create Patch .
  3. In the Patch File Settings dialog, modify the default patch file location if necessary and click OK .

If you do not need to save the patch to a file (for example, you want to send it by email instead), right-click the necessary file(s) in the Changes view and choose Copy as Patch to Clipboard from the context menu.

Create a patch from an entire commit

  1. In the Log tab of the Version Control tool window Alt+9 , locate the commit with the changes you want to include in the patch and select Create Patch from the context menu.
  2. In the Patch File Settings dialog, modify the default patch file location if necessary and click OK .

Create a patch from a file

  1. Select the necessary file in any view (the Project tool window, the editor, the Changes view, and so on).
  2. Select Git | Show History from the main VCS menu or from the context menu of the selection. The History tab is added to the Git tool window showing the history for the selected file and allowing you to review and compare its revisions.
  3. Right-click a revision and choose Create Patch from the context menu or click the Create Patch icon on the toolbar.

Apply patches

  1. Select VCS | Patch | Apply patch from the main menu.
  2. In the Apply Patch dialog that opens, specify the path to the .patch file you want to apply. You can drag a file or an email attachment to any place in the editor.
  3. If necessary, click and choose Map Base Directory to specify a directory relative to which file names in the patch file will be interpreted. You can map the base directory to a single file, directory, or selection.
  4. If the source code was edited after a patch was created, conflicts may arise. To check if your patch can be applied without conflicts, click Show Diff Control+D . If there are conflicts, the corresponding lines will be highlighted in red.
  5. If you want to apply changes to files stored in different locations than those specified in the patch, you can strip off the leading directories by clicking and choosing Remove All Leading Directories .
  6. Select the changelist to which you want to apply the patch or specify the name of a new changelist in the Name field, and enter a comment to this changelist (optionally).
  7. If you want to make this changelist active, select the Set active option.
  8. If you want IntelliJ IDEA to save the context of a task associated with the new changelist when deactivated and restore the context when the changelist becomes active, select the Track context option (refer to tasks and contexts for details).
  9. If you want to move the patch to a temporary storage (shelf) before applying it, click Import to shelf (for more information, refer to Shelve and unshelve changes). Otherwise, click OK .

You can also copy the content of a patch file and apply it by choosing VCS | Apply Patch from Clipboard from the main menu. For example, this is convenient when you receive a patch by email and do not want to save it. For Git format patches, IntelliJ IDEA extracts the commit message and the author and automatically fills the corresponding fields in the Commit tool window Alt+0 .

Учимся патчить и создавать патчи

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

1) Учимся патчить.

Патчить будем на примере уязвимости для FreeBSD (http://www.securitylab.ru/vulnerability/368343.php). Качаем оттуда патч (wget http://security.FreeBSD.org/patches/SA-09:05/telnetd.patch). После этого нужно выяснить, куда же его положить, что бы патч прошёл успешно. Для этого можно вывести на экран первые несколько строк:

Index: contrib/telnet/telnetd/sys_term.c
===================================================================
— contrib/telnet/telnetd/sys_term.c (revision 188667)
+++ contrib/telnet/telnetd/sys_term.c (working copy)
@@ -1271,8 +1271,18 @@

Смотрим внимательно и видим, какой файл он патчит. Поскольку путь начинается с contrib/telnetто можно предполодить, что файл должен находится в папке /usr/src. Копируем его туда и пробуем патчить:

Если после этого у вас на экран вывелось похожее на то, что ниже – значит всё удалось. Обычно стоит прочесть, вывод и удостоверится, что всё прошло succeed:

Hmm. Looks like a new-style context diff to me.
The text leading up to this was:
—————————
|*** ../convert.sh Fri Dec 5 17:00:52 2008
|— convert.sh Sat Apr 11 13:52:43 2009
—————————
Patching file convert.sh using Plan A.
Hunk #1 succeeded at 6.
done

Если вдруг патчу не удаётся найти нужный файл, он выдаёт запрос на указания пути вручную:

Hmm. Looks like a new-style context diff to me.
The text leading up to this was:
—————————
|*** convert1.sh Sat Apr 11 13:40:58 2009
|— convert.sh Fri Dec 5 17:00:52 2008
—————————
File to patch:

после введения пути:

File to patch: ../convert.sh
Patching file ../convert.sh using Plan A.
Reversed (or previously applied) patch detected! Assume -R?
Hunk #1 succeeded at 6.
done

Хочу заметить, что утилита patch имеет так же параметры, которые можно использовать. Например, довольно позным может оказаться ключ -C (–check), который позволяет посмотреть, какие изменения будут произведены с файлом, но не пропатчит.

2) Создание патчей.

– обычный

Создание патчей происходит немного сложнее, чем патчить. Для этого берём 2 версии одного и того же файла, помещаем их в разные директории, называем одинаково. После этого будем пользоваться командой diff для выявления разницы между файлами. Здесь самое главное соблюсти порядок в котором подаются имена файлов. ИСХОДНЫЙ_ФАЙЛ – эталонный файл, ИЗМЕНЁННЫЙ_ФАЙЛ – файл, который содержит изменения.

$diff -u ИСХОДНЫЙ_ФАЙЛ ИЗМЕНЁННЫЙ_ФАЙЛ > file.patch

где -u – означает унифицированный вывод, то есть с —/+++.

После такой операции будет создан файл file.patch, который собственно будет патчем. Файл патча можно так же открыть в текстовом редакторе и подредактировать пути к файлам, если необходимо.

Вот это и всё. Если хотите большего функционала – читайте man к указанным здесь бинарникам.

– через svn

Расскажу на примере коммита . Это исправление не вышло в качестве патча, зато вошло в коммит 269687. Наша идея такова: делаем diff между 2-мя соседними (нашим 269687 и предыдущим 269686) коммитами и накладываем патч:

# svn diff -r269686:269687 svn://svn.freebsd.org/base/stable/9 > /path/to/openssl.patch
# cd /usr/src && patch < /path/to/openssl.patch Оригинал статьи здесь.

Опубликовано с разрешения редакции журнала RootUA и газеты FOSS News

git — Создание патча из незакомиченных изменений

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

Если изменения еще не закомичены, для создания патча и сохрания его в файл — можно воспользоваться следующей командой:

git diff > diff.patch Code language: CSS (css)

где, diff.patch — имя файла

Этот вариант подойдет для случаев, когда все измененные файлы отслеживаемы — ранее были закомичены.

Если нужно создать git diff для новых файлов, можно воспользоваться следующим вариантом:

  • Подготовить все файлы для комита (командой git add ). Но не комитить.
  • Выполнить git diff с параметром —cached
git add . git diff --cached > diff.patch Code language: CSS (css)

Для добавления новых бинарных файлов в патч (например dll фалы) нужно выполнить следующие дейстрия:

  • Подготовить все файлы для комита (командой git add ). Но не комитить.
  • Выполнить git diff с параметром —binary
git add . git diff --cached --binary > diff.patchCode language: CSS (css)

Для применения патча воспользуемся командой git apply :

git apply diff.patchCode language: CSS (css)

PS: Также может быть интересным:

  • Как применить патч (git apply)?
  • С полным список параметров можно ознакомится на сайте

Похожие темы:

  • Git — как переименовать ветку?
  • git — как применить патч?
  • git — как изменить закоммиченное сообщение?
  • Git — you may want to set your merge.renamelimit variable to at least 1608 and retry the command.
  • Как удалить папки .@__thumb в Qnap?
  • Как отключить генерацию .@__thumb папки в Qnap?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *