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