【问题标题】:Applying a patch to files with spaces in names将补丁应用于名称中带有空格的文件
【发布时间】:2014-04-07 12:22:34
【问题描述】:

这是diff -u "temp temp/docs 1.txt" "temp temp/docs 2.txt"的输出:

--- temp temp/docs 1.txt    Mon Apr  7 16:15:08 2014
+++ temp temp/docs 2.txt    Mon Apr  7 16:18:45 2014
@@ -2,6 +2,6 @@
 22
 333
 4444
-555555
+55555
 666666
 7777777 

但是,将此差异提供给 patch -u 失败并显示以下消息:

can't find file to patch at input line 3
Perhaps you should have used the -p or --strip option?
The text leading up to this was:
--------------------------
|--- temp temp/docs 1.txt       Mon Apr  7 16:15:08 2014
|+++ temp temp/docs 2.txt       Mon Apr  7 16:18:45 2014
--------------------------

显然,空格是问题所在;有没有办法让patch 处理名称中有空格的文件?

【问题讨论】:

  • 附带说明,如果您使用 git,为什么不使用 git diffgit apply
  • @Cupcake 因为我没有使用 git?.. 我刚刚安装了带有 diffpatch 的 Cygwin。
  • 您的问题被标记为git :P 我会修复它...

标签: cygwin diff patch


【解决方案1】:

【讨论】:

  • 空白是“不寻常的字符”。确实,为什么有人想要文件名中的空格?当然,减号或下划线是更好的选择。还是谢谢。
【解决方案2】:

我在尝试建立约定如何使用差异和补丁进行手动版本控制时遇到了同样的问题。

我发现 GNU “diff”会在补丁标头中创建带引号的路径名,如果它们包含空格,而 BusyBox “diff”则不会。

GNU 和 BusyBox "patch" 都不接受引用的路径名。

如果问题只是文件名中的嵌入空格,因此可以通过使用“busybox patch”而不是 GNU“patch”来避免。

另一种解决方案是在将 GNU“diff”的输出输入“patch”之前对其进行后处理:

sed 's,^\([-+]\{3\} \)"\([^"]*\)",\1\2,' $PATCHFILE | patch -p1

无论 $PATCHFILE 是使用 GNU 还是 busybox diff 创建的,这都有效,但只能使用统一的 diff 格式。

不幸的是,这种方法无法保留文件名中的前导或尾随空格,因为“patch”会在从补丁说明中解析路径名时跳过它们。

如果文件名以文字双引号开头,则该方法将不起作用 - 但是,谁使用这样的文件名?

不过,大多数情况下,上述方法都可以正常工作。

最后,我也尝试过其他方法,但 没有 奏效:

首先,我尝试用单独引用的路径名组件替换整个路径名的引号。这失败了,因为“补丁”根本不使用双引号作为元字符。它认为它们是普通的文字字符。

然后我尝试像 CVS 那样用“\040”替换所有空格 - 但“patch”似乎也不接受八进制转义,这也失败了。

【讨论】:

    【解决方案3】:

    如果文件名与日期用制表符分隔,则 Gnu 补丁 2.6.1 (linux) 似乎遵守至少 1 个空格(未尝试更多)。

    YYMV

    【讨论】:

    • 为我工作,路径中有两个空格。如果路径有空格,git diff 似乎也会为您自动添加制表符。
    猜你喜欢
    • 2013-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    相关资源
    最近更新 更多