diff patch

https://stackoverflow.com/a/9982282

Щоб створити файл виправлення:

  1. Помістіть копії обох каталогів, скажімо, в /tmp, щоб ми могли створити файл виправлення, або, якщо ви сміливі, розмістіть їх поруч - в одному каталозі.
  2. Запустіть відповідну різницю в двох каталогах, старому та новому:

diff -ruN orig/ new/ > file.patch

  1. -r == recursive, so do subdirectories
  2. -u == unified style, if your system lacks it or if recipient may not have it, use “-c”
  3. -N == treat absent files as empty```

Якщо в користувача є каталог orig/, він може відтворити новий, запустивши patch.

Щоб повторно створити нову папку зі старої папки та файлу виправлення:

  1. Перемістіть файл виправлення до каталогу, де існує папка orig/
  2. Цю папку буде знищено, тому збережіть десь її резервну копію або скористайтеся копією.

patch -s -p0 < file.patch

  1. -s == silent except errors
  2. -p0 == needed to find the proper folder

На цьому етапі папка orig/ містить новий вміст, але все ще має стару назву, тому:

mv orig/ new/ # if the folder names are different

patch виправляв для мене каталог new/not orig/, але я знайшов -d опцію, яка дозволяє вам спочатку сказати cd в цьому каталозі перед застосуванням виправлення, а потім ви можете відповідно налаштувати -p N аргумент.

2

https://stackoverflow.com/a/51662346

Мені потрібно було створити файл виправлення та надіслати його комусь, щоб вони могли оновити свій каталог відповідно до мого. Однак у diff і patch є багато застережень , тому мені знадобилися години, щоб зрозуміти щось таке концептуально просте. Абсолютні шляхи, здається, мають перевагу над відносними шляхами, і багато варіантів, здається, розвинулися з нішевих випадків використання. Нарешті я знайшов рішення на основі відповіді Девіда Х з додатковими порадами від Лакшманана Ганапаті ):

Ось мої нотатки:

to create patch:

cp -r <path_to>/<directory> <path_to>/<directory>.orig

cd <path_to>/<directory>

diff -Naru ../<directory>.orig . > ../file.patch

# -N –new-file Treat absent files as empty.

# -a –text Treat all files as text.

# -r –recursive Recursively compare any subdirectories found.

# -u -U NUM –unified[=NUM] Output NUM (default 3) lines of unified context.

to apply patch change working directory to <directory>

cd <path_to>/<directory>
patch -s -p0 < <path_to>/file.patch

# -s or –silent or –quiet Work silently, unless an error occurs.

# -pN or –strip=N Strip smallest prefix containing num leading slashes from files.

to undo patch (note that directories created by patch must be removed manually):

# change working directory to <directory>
cd <path_to>/<directory>
patch -Rs -p0 < <path_to>/file.patch
# -R or --reverse Assume that patch was created with the old and new files swapped.
# -s or --silent or --quiet Work silently, unless an error occurs.
# -pN or --strip=N Strip smallest prefix containing num leading slashes from files.`

Для створення патча:

Щоб застосувати патч:

  1. змінити робочий каталог на <каталог> cd <шлях_до>/<каталог> patch -s -p0 < <шлях_до>/file.patch
  2. -s або –silent або –quiet Працювати безшумно, якщо не виникає помилка .
  3. -pN або –strip=N Вилучає з файлів найменший префікс, що містить кількість скісних риск.

Щоб скасувати виправлення (зауважте, що каталоги, створені за допомогою виправлення, потрібно видалити вручну):

  1. змінити робочий каталог на <каталог> cd <шлях_до>/<каталог> виправлення -Rs -p0 < <шлях_до>/file.patch
  2. -R або –reverse Припустимо, що патч було створено зі старим і новим файлами, поміняними місцями.
  3. -s або –silent або –quiet Працює тихо, якщо не виникає помилка.
  4. -pN або –strip=N Вилучає з файлів найменший префікс, що містить кількість скісних риск.

Мій приклад

cd /usr/local/
cp -a nodeny nodeny.orig
# change nodeny
 
# make patch 
diff -Naru nodeny.orig/ nodeny/ > ./pon_r710_01.patch
 
# apply patch for nodeny.orig
cd /usr/local/nodeny.orig/
patch -d . -Efu --posix -p1 < ../pon_r710_01.patch