svn diff 获取完整文件?

Posted

技术标签:

【中文标题】svn diff 获取完整文件?【英文标题】:svn diff for a complete file? 【发布时间】: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”会是您正在寻找的东西吗?这将向您显示该确切行何时添加到文件中。 【参考方案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

以上是关于svn diff 获取完整文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取SVN中文件/文件夹属性的历史记录?

不完整的数据:在git svn获取时,Delta源意外结束

当使用 svn cp 或 svn mv 时,如何使 svn diff 生成将应用补丁的文件?

SVN diff忽略已删除的文件

使用“diff”(或其他任何东西)来获取文本文件之间的字符级差异

如何使用 vimdiff 来 git diff /svn diff