Patch (Unix): различия между версиями

Материал из Википедии — свободной энциклопедии
Перейти к навигации Перейти к поиску
[непроверенная версия][отпатрулированная версия]
Содержимое удалено Содержимое добавлено
 
(не показаны 43 промежуточные версии 36 участников)
Строка 1: Строка 1:
{{lowercase|title=patch (Unix)}}
{{lowercase|title=patch (Unix)}}
{{Карточка программы
'''patch''' -- программная [[утилита]] [[Unix]], предназначенная для переноса правок (изменений) между разными [[версия|версиями]] текстовых файлов. Информация о правке обычно содержится в отдельном файле, называемом "правкой" "или файлом правки" ( ''patch file'' ). Подобный файл, как правило, создается с помощью другой утилиты Unix -- [[diff]], позволяющей автоматически извлечь информацию о различиях в тексте файлов.
|name = patch
|screenshot =
|caption =
|developer = Andreas Gruenbacher, Jim Meyering
|operating_system = [[Кроссплатформенное программное обеспечение]]
|genre =
|license = [[GPL]]
|website = http://savannah.gnu.org/projects/patch/
}}
'''patch''' — программная [[утилита]] [[Unix]], предназначенная для переноса правок (изменений) между разными версиями текстовых файлов. Информация о правке обычно содержится в отдельном файле, называемом «заплаткой», «правкой» или «файлом правки» («[[патч]]-файле» — {{lang-en|patch file}}). Подобный файл, как правило, создается с помощью другой утилиты Unix — [[diff]], позволяющей автоматически извлечь информацию о различиях в тексте файлов.


==История==
== История ==
Оригинальная версия программы patch была написана будущим автором [[Perl]] [[Ларри Уоллом | Larry Wall]] ( [http://groups-beta.google.com/group/mod.sources/browse_thread/thread/c5240ceb77b7f586/488b0929254d936a posted to <tt>mod.sources</tt>] ) . Сегодня программа patch является частью [[GNU]] проекта и поддерживается [[Free Software Foundation|FSF]].
Оригинальная версия программы patch была написана будущим автором [[Perl]] [[Уолл, Ларри|Larry Wall]] ([http://groups-beta.google.com/group/mod.sources/browse_thread/thread/c5240ceb77b7f586/488b0929254d936a posted to <tt>mod.sources</tt>]) . Сегодня программа patch является частью [[GNU]]-проекта и поддерживается [[Free Software Foundation|FSF]].


==Использование==
== Использование ==
В то время как исходным предназначением программы был перенос различий между версиями файлов программ (так, что программист, внесший в свою программу полезные изменения, мог поделиться этими изменениями с другими программистами, использующими предыдущие версии кода), patch может использоваться для переноса различий между любыми двумя текстовыми файлами, включая, но не ограничиваясь, программную документацию, html-файлы и т.д.
В то время как исходным предназначением программы был перенос различий между версиями файлов программ (так, что программист, внесший в свою программу полезные изменения, мог поделиться этими изменениями с другими программистами, использующими предыдущие версии кода), patch может использоваться для переноса различий между любыми двумя текстовыми файлами, включая, но не ограничиваясь, программную документацию, html-файлы и так далее.


"Файлы правок", или "патчи", или, неформально, "заплатки", используемые утилитой patch ("patch files", "patches"), являются текстовыми файлами специального формата. В отличие от них, существуют также бинарные файлы сходного назначения, однако последние, как правило, не имеют ничего общего с утилитой patch и связаны с задачами внесения изменений в бинарные (нетекстовые) файлы, в т. числе -- исполняемые файлы программ.
«Файлы правок», или «патчи», или, неформально, «заплатки», используемые утилитой patch («patch files», «patches»), являются текстовыми файлами специального формата. В отличие от них, существуют также бинарные файлы сходного назначения, однако последние, как правило, не имеют ничего общего с утилитой patch и связаны с задачами внесения изменений в бинарные (нетекстовые) файлы, в том числе — исполняемые файлы программ.


== Содержимое файлов-патчей ==
Файлы являющиеся результатом работы [[diff]], имеют определенный формат, удобный, в том числе, для чтения и внесения правок «вручную» самим пользователем.


==Пример использования==
Пример содержимого такого файла:
<syntaxhighlight lang="diff">
Для создания патча, или файла правки, с помощью утилиты diff, выполните в командной строке:
--- a/path/to/file 2021-01-26 22:55:55.288371691 +0300
+++ b/path/to/file 2021-01-26 22:58:31.790414616 +0300
@@ -1,5 +1,8 @@
+#include <stdio.h>
+
int
-main(void)
+main(int argc, char** argv)
{
+ printf("%s: Example `diff` usage;\n", __FILE__);
return 0;
}
</syntaxhighlight>
На строке, начинающейся с тройного знака «минус» (в простейшем случае - первая строка), указан относительный путь к оригинальному файлу и время последних изменений. Затем на следующей строке после тройного знака «плюс» указан относительный путь и время последних изменений финальной версии файла, используемой для создания патча.


Далее, на строке, начинающейся и заканчивающейся двойным символом «@», после знака «минус» указан '''номер строки''' начала приведенного участка текста и '''количество строк''', которое этот участок занимал в старой версии файла, а после знака «плюс» - аналогичные характеристики участка в новом файле. Ниже приводится сам участок, где вначале каждой строки добавлен пробел, если строка не менялась, «минус» - если она отсутствует в новом файле, и, соответственно, «плюс» - если эта строка была добавлена.
$ diff -u старый_файл новый_файл > разница.diff # ключ -u командует diff выдавать разницу в т.наз. стандартном ("унифицированном") формате
В приведенном выше примере файла присутствует только один такой сегмент, однако их может быть любое количество. Кроме того, патч может содержать сведения об изменениях, внесенных в другие файлы, если команда <code>diff</code> применялась к директории.


Очень часто создание патчей происходит в контексте использования какой-либо [[Система управления версиями|системы контроля версий]]. Если файл изменений создавался средствами одной из них, например [[git]], то формат принципиально отличаться не будет, в нем просто может оказаться дополнительная, избыточная для утилиты <code>patch</code>, информация.
Чтобы применить полученный патч, наберите в командной строке:


== Пример использования ==
$ patch < разница.diff
Для создания патча, или файла правки, с помощью утилиты diff выполните в командной строке:


<source lang="bash">
( и нажмите <<ввод>> ).
$ diff -u старый_файл новый_файл > разница.diff
# ключ -u указывает программе diff выдавать разницу в так называемом "стандартном" ("унифицированном") формате
</source>


Чтобы применить полученный патч, выполните следующую команду:
Выполнение последней команды перенесет разницу из нового файла в старый. ( Если старый файл не будет найден по заданному пути, программа выдаст ошибку. )


$ patch < разница.diff
Патч можно "откатить", т.е. отменить, передав программе patch ключ -R:


Выполнение последней команды перенесёт разницу из нового файла в старый, обновив старый файл (если старый файл не будет найден по заданному пути, программа выдаст ошибку).
$ patch -R < разница.diff


Патч можно «откатить», то есть отменить, передав программе patch ключ -R:


$ patch -R < разница.diff
Как правило, утилита patch способна правильно обновить файл и в том случае, когда он несколько изменился (например, был отредактирован в области, не перекрывающейся с областью применения текущей "заплатки").


Как правило, утилита patch способна правильно обновить файл и в том случае, когда он несколько изменился (например, был отредактирован в области, не перекрывающейся с областью применения текущей «заплатки»).
Для этого утилита patch использует "контекст" -- несколько строчек, соседних с областью применения патча, хранящихся в файле правки наряду с другой информацией о замене.


Для этого утилита patch использует «контекст» — несколько строчек, соседних с областью применения патча, хранящихся в файле правки наряду с другой информацией о замене.
Однако в случае существенного расхождения файла, к которому применяется ("накладывается") патч, и исходного файла, использовавшегося при создании патча, корректность применения патча, вообще говоря, не гарантируется.


Однако в случае существенного расхождения файла, к которому применяется («накладывается») патч, и исходного файла, использовавшегося при создании патча, корректность применения патча, вообще говоря, не гарантируется.
== Портирование ( перенос на другие платформы ) ==


== Портирование (перенос на другие платформы) ==
Созданная для применения на Unix-системах, утилита patch была впоследствии перенесена на платформу [[Microsoft Windows|Windows]] и некоторые другие. Версии patch для Windows можно найти в пакетах [[GnuWin32]] и [[UnxUtils]], а также в среде [[Cygwin]].
Созданная для применения на Unix-системах, утилита patch была впоследствии перенесена на платформу [[Microsoft Windows|Windows]] и некоторые другие. Версии patch для Windows можно найти в пакетах [[GnuWin32]] и {{iw|UnxUtils}}, а также в среде [[Cygwin]].


== См. также ==
== См. также ==
* [[diff]]
* [[quilt]]
* [[Patch (computing)]]
* [[Quilt (software)|quilt]]
* [[rsync]]
* [[rsync]]
* IEBUPDTE — аналог программы patch, созданный примерно на 20 лет раньше (предположительно в 1964 году для мейнфреймов [[System 360]]).
* [[List of Unix programs]]

* [[IBM mainframe utility programs#IEBUPDTE|IBM Mainframe utility IEBUPDTE]] аналог программы patch, созданный примерно на 20 лет раньше ( предположительно в 1964 году ).
== Примечания ==
{{примечания}}


== Ссылки ==
==Внешние ссылки==
*{{man|1|patch||apply a diff file to an original}}
* {{man|1|patch||применение файла различий (diff) к оригиналу}}
* [http://freshmeat.net/projects/patchutils/ Patchutils] — Дополнительные программы для работы с патчами
*{{Freshmeat|patchutils|patchutils}}{{ndash}} Additional utility programs for manipulating patches
*[http://gnuwin32.sourceforge.net/ GNU tools for Win32]{{ndash}} Win32 port of tools, including diff and patch
* [http://gnuwin32.sourceforge.net/ GNU tools for Win32] — Win32-порт утилит GNU, включая diff и patch
*[http://invisible-island.net/diffstat/ diffstat]{{ndash}} show statistics from output of diff
* [https://web.archive.org/web/20151211201038/http://invisible-island.net/diffstat/ diffstat] — выдача статистики на основе вывода утилиты diff


{{Команды Unix}}
[[Category:1985 software]]
[[Category:Unix software]]
[[Category:Patch utilities]]


[[Категория:Утилиты Unix]]
[[da:Patch (program)]]
[[de:Patch (Unix)]]
[[fi:Patch (ohjelmisto)]]
[[fr:Patch (informatique)]]
[[ja:Patch]]
[[pt:Patch (Unix)]]
[[sv:Patch]]

Текущая версия от 13:01, 20 февраля 2023

patch
Скриншот программы patch
Тип утилита UNIX[вд]
Разработчики Andreas Gruenbacher, Jim Meyering
Операционная система Кроссплатформенное программное обеспечение
Первый выпуск 1985
Аппаратная платформа кроссплатформенность
Последняя версия
Репозиторий git.savannah.gnu.org/git…
Лицензия GPL
Сайт savannah.gnu.org/project…

patch — программная утилита Unix, предназначенная для переноса правок (изменений) между разными версиями текстовых файлов. Информация о правке обычно содержится в отдельном файле, называемом «заплаткой», «правкой» или «файлом правки» («патч-файле» — англ. patch file). Подобный файл, как правило, создается с помощью другой утилиты Unix — diff, позволяющей автоматически извлечь информацию о различиях в тексте файлов.

Оригинальная версия программы patch была написана будущим автором Perl Larry Wall (posted to mod.sources) . Сегодня программа patch является частью GNU-проекта и поддерживается FSF.

Использование

[править | править код]

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

«Файлы правок», или «патчи», или, неформально, «заплатки», используемые утилитой patch («patch files», «patches»), являются текстовыми файлами специального формата. В отличие от них, существуют также бинарные файлы сходного назначения, однако последние, как правило, не имеют ничего общего с утилитой patch и связаны с задачами внесения изменений в бинарные (нетекстовые) файлы, в том числе — исполняемые файлы программ.

Содержимое файлов-патчей

[править | править код]

Файлы являющиеся результатом работы diff, имеют определенный формат, удобный, в том числе, для чтения и внесения правок «вручную» самим пользователем.

Пример содержимого такого файла:

--- a/path/to/file	2021-01-26 22:55:55.288371691 +0300
+++ b/path/to/file	2021-01-26 22:58:31.790414616 +0300
@@ -1,5 +1,8 @@
+#include <stdio.h>
+
 int
-main(void)
+main(int argc, char** argv)
 {
+	printf("%s: Example `diff` usage;\n", __FILE__);
 	return 0;
 }

На строке, начинающейся с тройного знака «минус» (в простейшем случае - первая строка), указан относительный путь к оригинальному файлу и время последних изменений. Затем на следующей строке после тройного знака «плюс» указан относительный путь и время последних изменений финальной версии файла, используемой для создания патча.

Далее, на строке, начинающейся и заканчивающейся двойным символом «@», после знака «минус» указан номер строки начала приведенного участка текста и количество строк, которое этот участок занимал в старой версии файла, а после знака «плюс» - аналогичные характеристики участка в новом файле. Ниже приводится сам участок, где вначале каждой строки добавлен пробел, если строка не менялась, «минус» - если она отсутствует в новом файле, и, соответственно, «плюс» - если эта строка была добавлена. В приведенном выше примере файла присутствует только один такой сегмент, однако их может быть любое количество. Кроме того, патч может содержать сведения об изменениях, внесенных в другие файлы, если команда diff применялась к директории.

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

Пример использования

[править | править код]

Для создания патча, или файла правки, с помощью утилиты diff выполните в командной строке:

  $ diff -u старый_файл новый_файл > разница.diff
  # ключ -u указывает программе diff выдавать разницу в так называемом "стандартном" ("унифицированном") формате

Чтобы применить полученный патч, выполните следующую команду:

 $ patch < разница.diff

Выполнение последней команды перенесёт разницу из нового файла в старый, обновив старый файл (если старый файл не будет найден по заданному пути, программа выдаст ошибку).

Патч можно «откатить», то есть отменить, передав программе patch ключ -R:

 $ patch -R < разница.diff

Как правило, утилита patch способна правильно обновить файл и в том случае, когда он несколько изменился (например, был отредактирован в области, не перекрывающейся с областью применения текущей «заплатки»).

Для этого утилита patch использует «контекст» — несколько строчек, соседних с областью применения патча, хранящихся в файле правки наряду с другой информацией о замене.

Однако в случае существенного расхождения файла, к которому применяется («накладывается») патч, и исходного файла, использовавшегося при создании патча, корректность применения патча, вообще говоря, не гарантируется.

Портирование (перенос на другие платформы)

[править | править код]

Созданная для применения на Unix-системах, утилита patch была впоследствии перенесена на платформу Windows и некоторые другие. Версии patch для Windows можно найти в пакетах GnuWin32 и UnxUtils[англ.], а также в среде Cygwin.

  • quilt
  • rsync
  • IEBUPDTE — аналог программы patch, созданный примерно на 20 лет раньше (предположительно в 1964 году для мейнфреймов System 360).

Примечания

[править | править код]
  • patch(1): применение файла различий (diff) к оригиналу — страница справки man по пользовательским командам GNU/Linux  (англ.)
  • Patchutils — Дополнительные программы для работы с патчами
  • GNU tools for Win32 — Win32-порт утилит GNU, включая diff и patch
  • diffstat — выдача статистики на основе вывода утилиты diff