当前位置 : 主页 > 网络编程 > 其它编程 >

开发笔记:SVNdiff忽略已删除的文件

来源:互联网 收集:自由互联 发布时间:2023-07-02
篇首语:本文由编程笔记#自由互联小编为大家整理,主要介绍了SVNdiff忽略已删除的文件相关的知识,希望对你有一定的参考价值。 篇首语:本文由编程笔记#自由互联小编为大家整理,
篇首语:本文由编程笔记#自由互联小编为大家整理,主要介绍了SVNdiff忽略已删除的文件相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#自由互联小编为大家整理,主要介绍了SVN diff忽略已删除的文件相关的知识,希望对你有一定的参考价值。

我是SVN的新手,我不确定我做错了什么。

我从包含以下内容的存储库开始:

HelloWorld.java

我在我的计算机上创建了一个工作集,然后将HelloWorld.java复制到HelloWorldDe.java。然后我将HelloWorld.java重命名为HelloWorldEn.java并修改HelloWorldDe.java中的单行。在此之后,我有一个工作集,其中包含:

HelloWorldEn.java <-- Renamed copy of HelloWorld.javaHelloWorldDe.java <-- Renamed copy of HelloWorld.java with one line change

当我做SVN状态时,我得到这个:

A HelloWorldDe.javaD HelloWorld.javaA 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 fileHelloWorldEn.javaHelloWorldDe.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!");- }-}

不会删除HelloWorld.java,它只会删除用-指示的所有行,这就是所有行。

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

另一答案

1.首先,几个问题

  • 您使用的是什么版本的subversion? (见第3部分)
  • 你是如何产生German.diff的?我们是否假设German.diff看起来与你提出的svn diff的输出完全一样?
  • 2.补丁确实删除了文件

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

    -E或--remove-empty-files

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

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

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

    3. 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中修复。

    另一答案

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

    见https://www.tutorialspoint.com/unix_commands/patch.htm

    上一篇:centos7上docker的安装和启动
    下一篇:没有了
    网友评论