将补丁应用于名称中带有空格的文件

3
这是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 

然而,将此diff输入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呢? - user456814
@ Cupcake 因为我没有使用 git?.. 我只是安装了 Cygwin,并使用 diffpatch - Joker_vD
1
你的问题被标记为 [tag:git] :P 我会修复它... - user456814
3个回答

3

空格是一种“不寻常的字符”。实际上,为什么有人会想在文件名中使用空格呢?肯定减号或下划线更好一些。无论如何,还是谢谢。 - Joker_vD

1
"Gnu patch 2.6.1 (linux)" 似乎至少在文件名与日期之间使用制表符时,会遵守至少一个空格(未尝试使用更多空格)。
"YYMV"

在我的电脑上,路径中有两个空格是可以正常工作的。另外,如果路径中包含空格,git diff 命令似乎会自动添加制表符。 - Tinister
每次刷新 Quilt 都需要对系列文件中由补丁文件修改的带空格的文件/路径执行此操作。这非常令人烦恼,我希望有一种方法可以告诉 Quilt 刷新只需在每个标题文件名上添加一个制表符,而不是在“pop”上失败(它应用得很好)。 - i30817

0

当我尝试使用diff和patch进行手动版本控制时,我遇到了同样的问题。

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

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

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

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

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

这个方法适用于使用GNU或busybox diff创建的$PATCHFILE,但仅适用于统一的diff格式。

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

如果文件名以文字双引号开头,则该方法也无法工作-但是,谁会使用这样的文件名呢?

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

最后,我还尝试了其他方法,但并没有成功:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接