Cygwin 将修补程序应用于名称中带有空格的文件

Cygwin 将修补程序应用于名称中带有空格的文件,cygwin,diff,patch,Cygwin,Diff,Patch,下面是diff-u“temp-temp/docs 1.txt”和“temp-temp/docs 2.txt”的输出 但是,将此差异馈送到补丁-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

下面是
diff-u“temp-temp/docs 1.txt”和“temp-temp/docs 2.txt”的输出

但是,将此差异馈送到
补丁-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
--------------------------

显然,空间是问题所在;有没有办法让
补丁
在名称中有空格的文件上工作?

没有,GNU补丁不支持这个。以下是官方声明:

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

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

GNU和BusyBox“补丁”都不接受带引号的路径名

如果问题只是在文件名中嵌入空格,那么可以通过使用“busybox补丁”而不是GNU“补丁”来避免

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

无论$PATCHFILE是使用GNU还是busybox diff创建的,它都可以工作,但只适用于统一的diff格式

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

如果文件名以文本双引号开头,这种方法将不起作用——但是,谁会使用这样的文件名呢

然而,在大多数情况下,上述方法都可以正常工作

最后,请注意我也尝试过但不起作用的其他方法:

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

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

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


YYMV

作为旁注,如果您使用的是git,为什么不使用
git diff
git apply
?@Cupcake,因为我没有使用git?。。我刚刚安装了一个Cygwin,带有
diff
patch
。您的问题被标记为:P我会解决它…空白是一个“不寻常的字符”。事实上,为什么有人希望在文件名中有一个空格?当然,减号或下划线是更好的选择。无论如何,谢谢你。
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
--------------------------
sed 's,^\([-+]\{3\} \)"\([^"]*\)",\1\2,' $PATCHFILE | patch -p1