将修补程序应用于名称中包含空格的文件

时间:2014-04-07 12:22:34

标签: cygwin diff patch

这是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处理名称中带空格的文件?

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

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

我发现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格式。

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

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

然而,大多数情况下,上述方法效果很好。

最后我还尝试了一些其他方法,但工作:

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

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

答案 2 :(得分:0)

Gnu补丁2.6.1(linux)似乎服从至少1个空格(未尝试更多)如果文件名与日期与标签分开。

YYMV