Показати сторінкуСтарі ревізіїПосилання сюдиЕкспорт до PDFПовернутися наверх Ця сторінка доступна тільки для перегляду. Ви можете продивитися вихідний текст, але не можете змінювати його. Якщо ви вважаєте, що це не вірно, зверніться до адміністратора. ====== 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 <directory> backup to something like <directory>.orig alongside it cp -r <path_to>/<directory> <path_to>/<directory>.orig # create/update/delete files/folders in <directory> until desired state is reached # change working directory to <directory> cd <path_to>/<directory> # create patch file alongside <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.` Для створення патча: * скопіюйте резервну копію <каталог> у щось на кшталт <каталог>.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 Вилучає з файлів найменший префікс, що містить кількість скісних риск. ===== Мій приклад ===== <code bash> 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 </code> freebsd/diff.txt Востаннє змінено: 10/06/2023 21:45повз Method Увійти