Поиск по сайту:

Совместная работа над файлом с помощью различий и исправлений Linux.


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

Я редактирую много текстовых файлов. Иногда это код. В других случаях это письменные обозначения ролевых игр (РПГ), книг по программированию или обычной переписки. Иногда приятно внести изменения, но чтобы мой соавтор сравнил мои изменения с тем, что они изначально написали. Многие люди по умолчанию используют офисные пакеты, такие как LibreOffice, используя комментарии или функции отслеживания изменений. Однако иногда более простой инструмент имеет больше смысла, и для этого вы можете просмотреть историю программирования таких инструментов, как diff и patch, которые обеспечивают стандартизированное форматирование для отслеживания и применения изменений. к общим файлам.

Даже при использовании простого файла существует сложность синхронизации двух документов. Некоторые элементы изменяются, другие остаются в покое, добавляется новое содержимое, а некоторые остаются прежними, но перемещаются в разные места документа. Трудно воспроизвести изменения без блаженного признания того, что все изменения одинаково действительны, и без замены старого файла новым. Он также монолитно непрозрачен. Изменений так много, что сложно выделить именно то, что изменилось.

С помощью команды diff вы можете создать запись об изменении файла, а с помощью patch вы можете "воспроизвести" эти изменения поверх старой версии, чтобы привести ее в соответствие с дата с новой версией.

Настраивать

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



На данный момент файл tea.md содержит сырую копию:

Boil water.
Warm the teapot.
Add tea and water to the teapot.
Place a tea cosy over the teapot.
Steep for 6 minutes.
Pour tea into cup.
Add milk.

Это кажется разумным, но всегда можно провести оптимизацию, поэтому отправьте файл мне на доработку. Чтобы прояснить процесс приготовления чая, я копирую файл как tea-revision.md и редактирую его, получая в итоге следующее:

Warm a teapot in the proving drawer of your oven.
Boil water.
Add tea leaves to a tea strainer.
Add strainer and water to teapot.
Steep for 6 minutes. Keep it warm with a tea cosy.
Pour tea into cup.
Optionally, add warm milk.

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

Создать разницу

Инструмент diff выводит разницу между двумя файлами. Есть несколько разных способов просмотра результатов, но я думаю, что самый понятный из них – представление --unified (для краткости -u ), которое показывает, какие строки были добавлены. или вычитается. Строка, которая каким-либо образом изменилась, рассматривается как строка, которая была вычтена, а затем добавлена. По умолчанию diff выводит результаты на терминал.

Укажите diff старый файл, а затем новый файл:

$ diff --unified tea.md tea-revised.md 
--- tea.md      2021-11-13 10:26:25.082110219 +1300
+++ tea-revised.md      2021-11-13 10:26:32.049110664 +1300
@@ -1,7 +1,7 @@
+Warm a teapot in the proving drawer of your oven.
 Boil water.
-Warm the teapot.
-Add tea and water to the teapot.
-Place a tea cosy over the teapot.
-Steep for 6 minutes.
+Add tea leaves to a tea strainer.
+Add strainer and water to teapot.
+Steep for 6 minutes. Keep it warm with a tea cosy.
 Pour tea into cup.
-Add milk.
+Optionally, add warm milk.

Знак плюса (+) в начале строки указывает на то, что что-то было добавлено в старый файл. Знак минус (-) в начале строки указывает на то, что строка была удалена или изменена.

Создать патч с diff

Файл исправления — это результат выполнения команды diff --unified , помещенной в файл. Вы можете сделать это, используя стандартное перенаправление Bash:

$ diff -u tea.md tea-revised.md > tea.patch

Содержимое файла точно такое же, как и то, что было выведено на терминал. Мне нравится просматривать файлы исправлений в Emacs, где каждая строка имеет цветовую маркировку в зависимости от того, была ли она добавлена или удалена.

Сет Кенлон, CC BY-SA 4.0)

Применение изменений с помощью патча

Как только у меня будет файл исправления, я смогу отправить его вам на рассмотрение и, при необходимости, применить к вашему старому файлу. Вы применяете патч с помощью команды patch :

$ patch tea.md tea.patch

Строки добавлялись, строки вычитались, и в итоге у вас получился файл, идентичный моей версии:

$ cat tea.md
Warm a teapot in the proving drawer of your oven.
Boil water.
Add tea leaves to a tea strainer.
Add strainer and water to teapot.
Steep for 6 minutes. Keep it warm with a tea cosy.
Pour tea into cup.
Optionally, add warm milk.

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

Установить

В Linux и macOS уже есть команды diff и patch . В Windows вы можете получить diff и patch через Cygwin или использовать Chocolatey для поиска diffutils и патча.

Если вы когда-либо пытались совместно работать над файлами по электронной почте или в чате и пытались описать где вам нужно внести изменения, то вам понравится diff и патч. Тщательно структурированный файл, такой как код или Markdown с разделителями строк, легко различать, исправлять и поддерживать. 

Статьи по данной тематике: