我知道已经有多个线程,但是还没有人完全解释如何执行初始差异来创建补丁文件,然后如何将补丁应用于初始目录以对其进行更新。
就我而言,有一个文件目录,任何人都可以从网上下载。我已经对该目录进行了更改,并想要创建一个补丁文件,以便其他人可以将其应用到下载的目录中,以完全复制修改后的目录中的内容。
救命?关于如何应用我的补丁程序,我需要告诉其他人什么?
Answers:
我也遇到了同样的问题-关于如何做到一半的很多建议。好吧,这是我为使修补程序和未修补程序都能正常工作所做的工作:
要创建补丁文件:
将两个目录的副本都放在/ 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 /文件夹包含new /内容,但仍具有其旧名称,因此:
mv orig/ new/ # if the folder names are different
patch
正在为我修补new/
notorig/
目录,但是我找到了一个-d
选项,该选项使您可以cd
在应用修补程序之前先进入该目录,然后可以相应地调整-p N
参数。
我需要创建一个补丁文件并将其发送给某人,以便他们可以更新其目录以匹配我的目录。但是,有很多关于diff和patch的警告,因此最终花了我几个小时才能弄清概念上如此简单的内容。绝对路径似乎比相对路径更受青睐,而且许多选择似乎都是从利基用例演变而来的。我终于找到了基于David H的答案的解决方案,以及Lakshmanan Ganapathy的其他技巧):
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.
查看开源Scarab C ++库:https : //github.com/loyso/Scarab
它完全符合您的描述。它使用xdelta库构建每个文件的差异,并将其放入归档包中。您可以重新分发该程序包并应用差异。有Win32的二进制文件。
我是圣甲虫项目的作者。