====== diff patch ====== [[https://stackoverflow.com/a/9982282]] Щоб створити файл виправлення: - Помістіть копії обох каталогів, скажімо, в /tmp, щоб ми могли створити файл виправлення, або, якщо ви сміливі, розмістіть їх поруч - в одному каталозі. - Запустіть відповідну різницю в двох каталогах, старому та новому: diff -ruN orig/ new/ > file.patch - -r == recursive, so do subdirectories - -u == unified style, if your system lacks it or if recipient may not have it, use "-c" - -N == treat absent files as empty``` Якщо в користувача є каталог orig/, він може відтворити новий, запустивши patch. Щоб повторно створити нову папку зі старої папки та файлу виправлення: - Перемістіть файл виправлення до каталогу, де існує папка orig/ - Цю папку буде знищено, тому збережіть десь її резервну копію або скористайтеся копією. patch -s -p0 < file.patch - -s == silent except errors - -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 є багато застережень , тому мені знадобилися години, щоб зрозуміти щось таке концептуально просте. Абсолютні шляхи, здається, мають перевагу над відносними шляхами, і багато варіантів, здається, розвинулися з нішевих випадків використання. Нарешті я знайшов рішення на основі відповіді Девіда Х з додатковими порадами від Лакшманана Ганапаті ): * Резервне копіювання вашого directory до directory.orig * Змініть свій directory, щоб досягти бажаного стану * Збережіть різницю від directory.orig до directory, file.patch щоб ім’я відповідало одержувачу Ось мої нотатки: `# to create patch: # copy backup to something like .orig alongside it cp -r / /.orig # create/update/delete files/folders in until desired state is reached # change working directory to cd / # create patch file alongside diff -Naru ../.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 cd / patch -s -p0 < /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 cd / patch -Rs -p0 < /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.` Для створення патча: * скопіюйте резервну копію <каталог> у щось на кшталт <каталог>.orig поряд із ним cp -r <шлях_до>/<каталог> <шлях_до>/<каталог>.orig * створіть/оновіть/видалить файли/папки у <каталог>, поки не буде досягнуто бажаного стану * змініть робочий каталог на <каталог> cd <шлях_до>/<каталог> * створіть файл виправлення разом із <каталогом> diff -Naru ../<каталог>.orig . > ../file.patch * -N –новий-файл Вважати відсутні файли порожніми. * -a –текст Розглядати всі файли як текст. * -r –recursive Рекурсивно порівнює всі знайдені підкаталоги. * -u -U NUM –unified[=NUM] Вивести NUM (за замовчуванням 3) рядків уніфікованого контексту. Щоб застосувати патч: - змінити робочий каталог на <каталог> cd <шлях_до>/<каталог> patch -s -p0 < <шлях_до>/file.patch - -s або –silent або –quiet Працювати безшумно, якщо не виникає помилка . - -pN або –strip=N Вилучає з файлів найменший префікс, що містить кількість скісних риск. Щоб скасувати виправлення (зауважте, що каталоги, створені за допомогою виправлення, потрібно видалити вручну): - змінити робочий каталог на <каталог> cd <шлях_до>/<каталог> виправлення -Rs -p0 < <шлях_до>/file.patch - -R або –reverse Припустимо, що патч було створено зі старим і новим файлами, поміняними місцями. - -s або –silent або –quiet Працює тихо, якщо не виникає помилка. - -pN або –strip=N Вилучає з файлів найменший префікс, що містить кількість скісних риск. ===== Мій приклад ===== cd /usr/local/ cp -a nodeny nodeny.orig # change nodeny # make patch diff -Naru ./nodeny.orig ./nodeny > ../pon_r677_4.patch # apply patch for nodeny.orig patch -d nodeny.orig/ -Efu --posix -p1 < ./pon_r677_4.patch