Як створити патч для цілого каталогу для його оновлення?


75

Я знаю, що в цьому вже є декілька потоків, але ніхто до кінця не пояснив, як саме виконати початкову різницю для створення файлу виправлення, а потім як застосувати цю виправлення до початкового каталогу для її оновлення.

У моєму випадку є каталог файлів, які кожен може завантажити з Інтернету. Я взяв цей каталог і вніс у нього зміни, і хочу створити файл виправлення таким чином, щоб інші могли застосувати його до завантаженого каталогу, щоб відтворити саме те, що я маю у своєму зміненому каталозі.

Допомога? Що мені потрібно сказати іншій людині стосовно того, як застосовувати мій пластир?

Відповіді:


146

У мене просто була та сама проблема - багато порад про те, як наполовину це зробити. Ну, ось що я зробив, щоб і виправлення, і випатчування працювали:

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

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

  2. Запустіть відповідну різницю для двох каталогів, старого та нового:

    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 /, він може відтворити новий, запустивши патч.

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

  1. Перемістіть файл виправлення в каталог, де існує папка orig /

  2. Ця папка стане модною, тому зберігайте десь її резервну копію або використовуйте копію.

    patch -s -p0 < file.patch
    # -s == silent except errors
    # -p0 == needed to find the proper folder
    
  3. На цей момент папка orig / містить новий / вміст, але все ще має свою стару назву, тому:

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

7
Якби я не міг потиснути вам руку. Дуже дякую!
poundifdef

1
Я хлопець Mac, тому не маю уявлення. Потрібно перевірити параметри виправлення та різниці на Cygwin. Ось чому я додав коментарі вище про те, що означають параметри - тому, якщо та чи інша програма пропонує різні варіанти, ви можете зрозуміти, що змінити, щоб вона працювала. Концептуально всі програми patch / diff повинні підтримувати цю функціональність.
David H

@CharanPai "diff" не підтримує двійкові файли, тому я припускаю, що ні. Для цього ви можете створити власну обгортку командного файлу. Що б ви зробили, це binhex ваших файлів двійкових даних - створіть текстовий файл для кожного у binhex або подібному форматі ascii. Потім розшифруйте ці файли, і після того, як застосовано виправлення, вилучіть (можливо перероблений) файл binhex з помилками у двійковий файл.
David H

ні, -a би працював для цього. обробляє всі файли як текст.
Чаран Пай,

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

4

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

  • Резервне копіювання directoryTodirectory.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.

2

Перевірте бібліотеку Scarab C ++ з відкритим кодом: https://github.com/loyso/Scarab

Він робить саме те, що ви описали. Він створює різницю для кожного файлу за допомогою бібліотеки xdelta і поміщає її в архівний пакет. Ви можете розподілити цей пакет і застосувати різницю. Існують двійкові файли для Win32.

Я автор проекту Scarab.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.