无法在Solaris上应用统一的差异补丁

6

For example, if I have two files:

file1:

This is file 1

还有file2:

This is file 2

使用以下命令创建补丁:

diff -u file1 file2 > files.patch

结果是:

--- file1       Fri Aug 13 17:53:28 2010
+++ file2       Fri Aug 13 17:53:38 2010
@@ -1,1 +1,1 @@
-This is file 1
+This is file 2

如果我尝试使用补丁命令在Solaris上应用此补丁:

patch -u -i files.patch

它卡住了:

 Looks like a unified context diff.
File to patch:

1. 有没有一种方法可以使用Solaris本地的patch命令与统一的差异进行操作?

2. 如果无法应用统一格式,哪种差异格式被认为是最具可移植性的?

更新:我已经找到了第一个问题的答案。似乎在Solaris上,如果第二个文件(在本例中为file2)存在于与第一个文件(file1)相同的文件夹中,则patch会挂起。例如,以下非常常见的差异:

--- a/src/file.src       Sat Aug 14 23:07:29 2010
+++ b/src/file.src       Sat Aug 14 23:07:37 2010
@@ -1,2 +1,1 @@
-1
-
+2

这将不能与相当常见的补丁命令一起使用:

patch -p1 -u -d a < file.patch

以下是不同之处(请注意第二个文件已被重命名):

--- a/src/file.src       Sat Aug 14 23:07:29 2010
+++ b/src/file_new.src       Sat Aug 14 23:07:37 2010
@@ -1,2 +1,1 @@
-1
-
+2

这将完美地工作。

关于我的第二个问题,请参见下面接受的答案。

3个回答

6

在Solaris系统中,/usr/bin/patch是一个旧版本,必须遵守一些古老的标准。 从Solaris 8开始,提供了现代化的GNU patch版本,位于/usr/bin/gpatch


我知道。gpatch可能不是默认安装的,如果编译您的产品失败,因为没有gpatch,这并不是很好。 - Shcheklein

2
diff -cr old.new new.txt > patch.txt

gpatch -p0 < patch.txt

对我来说非常完美(使用gpatch)


1

Single Unix v2和v3都支持上下文差异,但不支持统一差异,因此为了更好的可移植性,您应该使用上下文差异(-c选项用于diffpatch)。

在旧版Solaris(我认为是10之前),您需要确保/usr/xpg4/bin$PATH中位于/usr/bin之前,否则您可能会得到某些实用程序的兼容版本而不是标准版本。


1
谢谢你的解释,Gilles。我会考虑使用上下文差异(context diffs)。就我所了解的而言,您不能在上下文差异补丁中写入有关要更改的源文件的信息。我是对的吗?这不是很方便...无论如何,我仍然不明白为什么我无法使用diff -u生成的差异运行patch -u。 - Shcheklein
@Shcheklein:你所说的“补丁信息关于源文件的更改”是什么意思?上下文差异确实包括文件名。POSIX要求支持diff -cr,因此这必须有效。顺便问一下,patch -p0有什么区别吗? - Gilles 'SO- stop being evil'
是的,上下文差异包含足够的信息。然而,Solaris的“patch”存在问题(请参见问题的更新)。-p0没有任何区别。似乎Solaris上的“patch”不喜欢块中两个名称相同或两个文件都存在的情况。 - Shcheklein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接