4

我对 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

谁能解释为什么我得到一个空文件而不是文件被删除?

4

3 回答 3

1

1.首先,几个问题

  1. 你用的是什么版本的subversion?(见第 3 部分)
  2. 你是如何生成German.diff 的?我们是否假设German.diff看起来与svn diff您提供的输出完全相同?

2.补丁确实删除了文件

patch确实通过删除所有行来删除本身为空的文件,通常是默认情况下,但如手册页中所述,这取决于实现。来自man patch

-E 或 --remove-empty-files

删除应用补丁后为空的输出文件。通常这个选项是不必要的,因为补丁可以检查头部的时间戳来确定一个文件在补丁之后是否应该存在。但是,如果输入不是上下文差异或补丁符合 POSIX,除非给出此选项,否则补丁不会删除空的补丁文件。当补丁删除一个文件时,它也会尝试删除任何空的祖先目录。

您可以强制使用此选项或强制--posix获得确定性行为。如果这样做,patch应删除该文件。

注意:可能会产生误导。它真的是空的吗,就像 size = 0 字节一样?或者只是一个\n字符,没有文字?我发现真正的空文件是一场噩梦patch,但如果它导致它们为空,它应该删除它们。

3.svn有bug

某些版本的 svn diff 根本不会将移动/重命名/删除的文件放在 diff 中!这取决于你如何称呼差异。因此,请确认您提供的补丁文件patchGerman.diff实际上在补丁中有该文件的条目,否则您可能会遇到这种情况。

见:http ://svn.haxx.se/dev/archive-2004-03/0333.shtml 。这封来自 SVN DEV 列表的存档电子邮件显示,在十多年前发布 1.0.1 之前的某个时间,开发人员自己发现了这个问题。

根据我的经验,这个问题在 SVN 1.7 中得到了修复。

于 2015-06-09T18:27:23.053 回答
0

这是因为补丁不会删除文件。它仅使用补丁文件中的内容修改它们。所以这:

--- 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,它只会删除所有用 a 指示的行-,即全部。

如果您已提交所做的更改然后运行svn up该文件,则该文件将被删除。但是补丁不是svn。

于 2012-08-25T18:41:53.377 回答
0

作为对此的更新,您可以使用 patch 命令的 -E 选项强制它在修补后删除空文件。

请参阅https://www.tutorialspoint.com/unix_commands/patch.htm

于 2018-03-02T13:06:53.180 回答