【问题标题】:Can't apply unified diff patch on Solaris无法在 Solaris 上应用统一差异补丁
【发布时间】:2010-08-13 14:04:44
【问题描述】:

例如,如果我有两个文件:

文件1:

This is file 1

和文件2:

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 native patch 命令

2。如果无法应用统一格式,则认为哪种 diff 格式最可移植?

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

--- 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

将完美运行。

对于我的问题的第二部分,请参阅下面接受的答案。

【问题讨论】:

    标签: diff solaris patch unified-diff


    【解决方案1】:

    在 Solaris 上,/usr/bin/patch 是一个旧版本,需要符合一些古老的标准。 现代版本的 GNU 补丁在 Solaris 8 及更高版本上以/usr/bin/gpatch 的形式提供。

    【讨论】:

    • 我知道。有可能是gpatch默认没有安装,当你的产品因为没有gpatch而编译失败时就不是很好了。
    【解决方案2】:
    diff -cr old.new new.txt > patch.txt
    
    gpatch -p0 < patch.txt
    

    非常适合我(使用 gpatch)

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 感谢 Gilles 的解释。我会考虑使用上下文差异。据我了解,您不能在上下文中写入有关要更改的源文件的差异补丁信息。我对吗?不是很方便……反正我还是不明白为什么我用 diff -u 产生的 diff 运行 patch -u 失败。
      • @Shcheklein:您所说的“要更改的源文件的补丁信息”是什么意思?上下文差异确实包括文件名。 POSIX 需要支持diff -cr,所以这必须工作。顺便问一下,patch -p0 有影响吗?
      • 是的,上下文差异包含足够的信息。但是,Solaris 的patch 的问题是不同的(请参阅问题的更新)。 -p0 没有任何区别。似乎 Solaris 上的 patch 不喜欢 hunk 中的两个名称相同或两个文件都存在。
      猜你喜欢
      • 2010-10-05
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 2021-11-25
      • 2011-09-30
      • 2017-11-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多