【问题标题】:svn diff for a complete file?svn diff 获取完整文件?
【发布时间】:2009-08-21 12:56:48
【问题描述】:

给定:一个 SVN 存储库,其中一个 bin 目录和一个 script.pl 在此 bin 中。在一些修订之前,binscript.pl 已在一次提交中添加到存储库中。从那时起,script.pl 应用了一些修订。

需要:一个 diff 命令,它将返回 script.pl 从零到 HEAD 的完整差异,即添加了所有行的差异。

背景:代码审查需要此差异,以提供给ReviewBoard

问题: svn diff-r X:HEADXscript.pl 的第一个修订版)在第一个版本和 HEAD 之间产生差异,而 -r X-1:HEAD 告诉我文件 @ 987654334@在修订版X-1中是未知的,实际上是正确的。但是,我找不到合适的解决方案,其中包括来自空文件的差异。我也无法区分bin 目录,因为它已添加到与script.pl 相同的提交中

解决方案: ?

【问题讨论】:

  • 必须是一个单一的 'svn diff' 命令,或者你可以围绕它编写脚本吗?
  • “svn blame”会是您正在寻找的东西吗?这将向您显示该确切行何时添加到文件中。

标签: svn diff


【解决方案1】:

没有临时文件:

echo "" | diff -u - script.pl

【讨论】:

  • 为什么不使用/dev/nulldiff -u /dev/null script.pl?
  • SVN 替换关键字(例如 $Date$、$Revision$、$Id$ 等)将在工作副本中展开,而“svn diff”不会展开这些关键字,所以这不一样
【解决方案2】:

某些版本的 SVN 似乎允许您执行 svn diff -r 0:HEAD file.txt,但有些版本不允许。对于那些不这样做的人,请使用以下内容:

svn diff --old=/path/to/root/of/repo@1 --new=/path/to/file.txt

这两种方法都适用于任何文件夹/文件/文件!

【讨论】:

    【解决方案3】:

    这是我在这种情况下使用的技巧:

    cp file1 file2
    svn add file2
    svn diff file2 > file1.diff
    svn rm --force file2
    

    【讨论】:

      【解决方案4】:

      等等,你想要当前 (HEAD) 版本的 script.pl 和空文件之间的差异吗?您不需要 diff ,因为差异只是当前 script.pl 的所有行,前面带有加号。很刺激,不是吗?

      如果你真的需要 diff 形式的,为什么不这样做呢?

      $ touch EMPTYFILE  # creates a new, empty file
      $ diff -u EMPTYFILE script.pl > script.pl.diff
      

      ... 或本地等效系统,如果您被功能较弱的系统卡住。

      【讨论】:

      • 让我们这样说:触摸和差异是一种技巧。用 Subversion pure 做这些事情是这个问题的实际意图——尤其是因为我想使用 ReviewBoard,它使用 Subversion 自己制作差异。我想知道为什么 Subversion 无法产生正确的差异并假设我很愚蠢,但事实证明是 Subversion 而不是我的功能有点不足:) 但无论如何,谢谢,我也许可以一起破解一些东西。
      • 另外,另一个问题是 SVN 替换关键字(例如 $Date$、$Revision$、$Id$ 等)将在工作副本中扩展,而您不会想要一个差异。 “svn diff”不会扩展这些关键字,这就是您想要的行为。
      【解决方案5】:

      我遇到了同样的问题,也没有找到解决方案。

      解决方法是生成文件的几个最近修订版本的差异,然后“扩展更改”向您显示完整的文件并允许在任何地方发表评论。

      【讨论】:

        【解决方案6】:

        Subversion 不会完全按照您的意愿行事。您可以做的最好的事情是与提交bin/script.pl 时存在的最低级别目录(大概是bin 的父级)的差异。

        【讨论】:

          【解决方案7】:

          有点破解,但应该让你去......

          提交所有内容

          for file in find . -name "*.*" | grep -v .svn; do echo "" > $file; done
          svn diff | sed -e 's/^-/+/g' > diffs.txt
          

          rm -rf 那个目录和svn up 它回来。

          【讨论】:

            【解决方案8】:

            从我的头顶:

            svn diff -r X-1:HEAD FILENAME@X
            

            随着时间的推移,文件名不是唯一键,但 filename@revision 是。

            【讨论】:

            • 看起来很有希望,但遗憾的是:svn: Unable to find repository location for script.pl in revision X-1
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-11-17
            • 1970-01-01
            • 1970-01-01
            • 2010-10-18
            • 2011-05-14
            • 1970-01-01
            • 2012-05-14
            相关资源
            最近更新 更多