如何为整个目录创建补丁以进行更新?


75

我知道已经有多个线程,但是还没有人完全解释如何执行初始差异来创建补丁文件,然后如何补丁应用于初始目录以对其进行更新。

就我而言,有一个文件目录,任何人都可以从网上下载。我已经对该目录进行了更改,并想要创建一个补丁文件,以便其他人可以将其应用到下载的目录中,以完全复制修改后的目录中的内容。

救命?关于如何应用我的补丁程序,我需要告诉其他人什么?

Answers:


146

我也遇到了同样的问题-关于如何做到一半的很多建议。好吧,这是我为使修补程序和未修补程序都能正常工作所做的工作:

要创建补丁文件:

  1. 将两个目录的副本都放在/ 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 /目录,则可以通过运行patch重新创建新目录。

要从旧文件夹和补丁文件重新创建新文件夹,请执行以下操作:

  1. 将补丁文件移动到orig /文件夹所在的目录

  2. 此文件夹将被破坏,因此请将其备份在某个地方或使用副本。

    patch -s -p0 < file.patch
    # -s == silent except errors
    # -p0 == needed to find the proper folder
    
  3. 此时,orig /文件夹包含new /内容,但仍具有其旧名称,因此:

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

7
希望我能和你握手。非常感谢!
poundifdef'4

1
我是Mac家伙,所以不知道。您要做的是检查Cygwin上的patch和diff选项。这就是为什么我在上面添加了有关这些选项含义的注释的原因-因此,如果一个程序或另一个程序提供了不同的选项,则您可以弄清楚进行更改后才能使其正常工作。从概念上讲,所有修补程序/差异程序应支持该功能。
David H

@CharanPai“ diff”不支持二进制文件,因此我认为不支持。您可能能够创建自己的命令文件包装器来执行此操作。您将要做的是二进制文件的二进制文件-为每个文件创建一个二进制文件,格式为binhex或类似的ascii格式。然后比较那些文件,并在应用补丁后,将(可能是经过修订的)binhex文件坏的二进制文件解压缩为二进制文件。
David H

不,-a可以解决这个问题。将所有文件视为文本。
Charan Pai 2014年

2
patch正在为我修补new/notorig/目录,但是我找到了一个-d选项,该选项使您可以cd在应用修补程序之前先进入该目录,然后可以相应地调整-p N参数。
dramzy

4

我需要创建一个补丁文件并将其发送给某人,以便他们可以更新其目录以匹配我的目录。但是,有很多关于diffpatch的警告,因此最终花了我几个小时才能弄清概念上如此简单的内容。绝对路径似乎比相对路径更受青睐,而且许多选择似乎都是从利基用例演变而来的。我终于找到了基于David H的答案的解决方案,以及Lakshmanan Ganapathy的其他技巧):

  • 备份directorydirectory.orig
  • 修改您directory的状态以达到所需状态
  • 将差异从保存directory.origdirectoryfile.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.

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.