Как создать патч для целого каталога, чтобы обновить его?
Я знаю, что на этом уже есть несколько потоков, но никто полностью не объяснил, как именно выполнить начальный diff для создания файла патча, а затем как применить этот патч на исходный каталог, чтобы обновить его.
в моем случае, есть каталог файлов, которые каждый может бесплатно скачать из интернета. Я взял этот каталог и внес в него изменения, и хочу создать файл патча, чтобы другие могли применить его к загруженному каталогу для воспроизведения именно то, что у меня есть в моем измененном каталоге.
помочь? Что мне нужно сказать другому человеку о том, как применить мой патч?
3 ответов:
у меня просто была такая же проблема - много советов о том, как наполовину это сделать. Ну, вот что я сделал, чтобы получить как исправление, так и распаковку для работы:
чтобы создать файл патча:
поместите копии обоих каталогов в say / tmp, чтобы мы могли создать патч файл, или если храбрый, получить их бок о бок - в одном каталоге.
запустите соответствующий 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/, они могут воссоздать новый, запустив патч.
воссоздать новую папку из старой папки и файла патч:
переместите файл патча в каталог, где находится папка orig/
эта папка будет забита, так что держите резервную копию его где-нибудь, или используйте копию.
patch -s -p0 < file.patch # -s == silent except errors # -p0 == needed to find the proper folderв этот момент ориг/ папка содержит новый контент, но все же имеет свое старое название, так что:
mv orig/ new/ # if the folder names are different
Проверьте библиотеку Scarab C++ с открытым исходным кодом:https://github.com/loyso/Scarab
Это именно то, что вы описали. Он строит для каждого файла diff с помощью библиотеки xdelta и помещает его в архивный пакет. Вы можете перераспределить этот пакет и применить разницу. Есть бинарники для Win32.
Я автор проекта Скарабей.
мне нужно создать патч и отправить его кому-то, чтобы они могли обновить свой каталог, чтобы соответствовать моим. Есть много предостережений с diff и патч однако, в конечном итоге мне потребовалось несколько часов, чтобы понять что-то настолько концептуально простое. Абсолютные пути, по-видимому, предпочтительнее относительных путей, и многие из вариантов, по-видимому, развились из нишевых вариантов использования. Я, наконец, понял решение, основанное на ответ Дэвида х, С дополнительные советы от Ганапати Lakshmanan):
- резервное копирование
directorytodirectory.orig- изменить
directoryдля достижения желаемого состояния- сохранить diff от
directory.origдоdirectoryinfile.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.
Comments