Как создать патч для целого каталога, чтобы обновить его?



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

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

помочь? Что мне нужно сказать другому человеку о том, как применить мой патч?

150   3  

3 ответов:

у меня просто была такая же проблема - много советов о том, как наполовину это сделать. Ну, вот что я сделал, чтобы получить как исправление, так и распаковку для работы:

чтобы создать файл патча:

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

  2. запустите соответствующий diff на двух каталогах, old и новое:

    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. в этот момент ориг/ папка содержит новый контент, но все же имеет свое старое название, так что:

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

Проверьте библиотеку Scarab C++ с открытым исходным кодом:https://github.com/loyso/Scarab

Это именно то, что вы описали. Он строит для каждого файла diff с помощью библиотеки xdelta и помещает его в архивный пакет. Вы можете перераспределить этот пакет и применить разницу. Есть бинарники для Win32.

Я автор проекта Скарабей.

мне нужно создать патч и отправить его кому-то, чтобы они могли обновить свой каталог, чтобы соответствовать моим. Есть много предостережений с diff и патч однако, в конечном итоге мне потребовалось несколько часов, чтобы понять что-то настолько концептуально простое. Абсолютные пути, по-видимому, предпочтительнее относительных путей, и многие из вариантов, по-видимому, развились из нишевых вариантов использования. Я, наконец, понял решение, основанное на ответ Дэвида х, С дополнительные советы от Ганапати Lakshmanan):

  • резервное копирование directory to directory.orig
  • изменить directory для достижения желаемого состояния
  • сохранить diff от directory.orig до directory in 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.
    Ничего не найдено.

Добавить ответ:
Отменить.