Как создать патч для всего каталога, чтобы обновить его? - PullRequest
61 голосов
/ 02 апреля 2012

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

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

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

Ответы [ 3 ]

117 голосов
/ 02 апреля 2012

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

Чтобы создать файл исправлений:

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

  2. Запустить соответствующий diff для двух каталогов, старого и нового:

    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 / содержит новый / content, но все еще имеет старое имя, поэтому:

    mv orig/ new/    # if the folder names are different
    
1 голос
/ 03 августа 2018

Мне нужно было создать файл патча и отправить его кому-нибудь, чтобы они могли обновить свой каталог, чтобы он соответствовал моему. Однако есть много предостережений с 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.
1 голос
/ 27 марта 2013

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

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

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

...