我是SVN的新手,我不确定我做错了什么。
我从一个包含以下内容的存储库开始:
HelloWorld.java
我在计算机上创建了一个工作集,然后将HelloWorld.java复制到HelloWorldDe.java。然后我将HelloWorld.java重命名为HelloWorldEn.java并修改HelloWorldDe.java中的单行。在此之后,我有一个包含以下内容的工作集:
HelloWorldEn.java <-- Renamed copy of HelloWorld.java
HelloWorldDe.java <-- Renamed copy of HelloWorld.java with one line change
当我做SVN状态时,我得到了这个:
A HelloWorldDe.java
D HelloWorld.java
A HelloWorldEn.java
当我做SVN diff时,我得到了这个:
Index: HelloWorldDe.java
===================================================================
--- HelloWorldDe.java (revision 0)
+++ HelloWorldDe.java (revision 0)
@@ -0,0 +1,5 @@
+public class HelloWorld {
+ public static void main( String [] args ) {
+ System.out.println("Hallo welt!");
+ }
+}
Index: HelloWorld.java
===================================================================
--- HelloWorld.java (revision 13)
+++ HelloWorld.java (working copy)
@@ -1,5 +0,0 @@
-public class HelloWorld {
- public static void main( String [] args ) {
- System.out.println("Hello World!");
- }
-}
Index: HelloWorldEn.java
===================================================================
--- HelloWorldEn.java (revision 0)
+++ HelloWorldEn.java (revision 0)
@@ -0,0 +1,5 @@
+public class HelloWorld {
+ public static void main( String [] args ) {
+ System.out.println("Hello World!");
+ }
+}
然而,当我尝试在原始工作集上运行“patch -p0 -i German.diff”时,我最终得到了这个:
HelloWorld.java <-- Empty file
HelloWorldEn.java
HelloWorldDe.java
有谁可以解释为什么我得到一个空文件而不是被删除的文件?
答案 0 :(得分:1)
这是因为补丁不会删除文件。它只使用补丁文件中的内容修改它们。所以这个:
--- HelloWorld.java (revision 13)
+++ HelloWorld.java (working copy)
@@ -1,5 +0,0 @@
-public class HelloWorld {
- public static void main( String [] args ) {
- System.out.println("Hello World!");
- }
-}
不会删除HelloWorld.java,它只会删除-
所指示的所有行,这就是所有行。
如果您已提交所做的更改,然后运行svn up
,则该文件将被删除。但补丁不是svn。
答案 1 :(得分:0)
subversion
? (见第3部分)svn diff
的输出完全相同? patch
通过删除所有行删除本身为空的文件,通常默认情况下,但正如手册页中所述,它取决于实现。来自man patch
:
-E或--remove-empty-files
删除应用修补程序后为空的输出文件。通常这个选项是不必要的,因为 patch可以检查标头上的时间戳,以确定修补后文件是否应该存在。但是,如果 输入不是上下文差异,或者如果补丁符合POSIX,补丁不会删除空的补丁文件,除非 给出了这个选项。当patch删除文件时,它还会尝试删除任何空的祖先目录。
您可以强制使用此选项或强制--posix
获取确定性行为。如果您这样做,patch
应删除该文件。
注意:空可能会产生误导。它是否为空,如size = 0字节?或者只有一个\n
字符,没有文字?我发现真正空文件是patch
的噩梦,但如果它导致它们为空,则应删除它们。
svn
有一个错误某些版本的svn diff根本不会将移动/重命名/删除的文件放入差异中!这取决于你如何调用diff。所以 请确认 您提供给patch
( German.diff ), 的补丁文件在补丁中有一个 条目,否则你可能会受此影响。
请参阅:http://svn.haxx.se/dev/archive-2004-03/0333.shtml。来自SVN DEV列表的这封存档电子邮件显示,开发人员自己在十多年前发布1.0.1之前的某个时间就已经发现了这个问题。
根据我的经验,此问题已在SVN 1.7中修复。
答案 2 :(得分:0)
作为对此的更新,您可以使用patch命令的-E选项强制它在修补后删除空文件。