如何在Subversion中将分支与主干进行比较?

43

在Subversion中,我使用svn copy从主干创建了一个分支。根据SVN 1.5手册,“这是在存储库中“标记”修订版本的最简单方法-只需将该修订版本(通常是HEAD)复制到您的tags目录中。”

svn copy file:////svn/projectX/trunk file:///svn/projectX/branches/stefanl
然后,我对stefanl分支进行了修改。我想将我的更改提交到主干,但在这样做之前,我想看到更改的diff。如何对'stefanl'分支与'trunk'分支进行diff?我尝试了svn diff,但它没有提供太多信息:
% svn diff file:////svn/projectX/trunk file:///svn/projectX/branches/stefanl
Property changes on: .
___________________________________________________________________
Modified: svn:mergeinfo
   Reverse-merged /trunk:r1699-1870

那应该可以。你确定已经将更改提交到了你的分支吗?你是在询问是否可以比较你的工作副本和另一个分支吗? - Rup
1
@Rup:我已经将我的更改提交到“stefanl”分支。现在我想将“stefanl”分支合并到主干上。但在此之前,我想预览一下这些更改。 我以为svn diff会显示主干和我的分支之间的所有差异,但实际上它没有。 - Stefan Lasiewski
1
@Stevan:svn diff在这种用法下确实显示分支之间的差异。它没有显示任何内容意味着没有差异。检查svn log -v file:///svn/projectX的输出,以查看发生了什么,特别是要查看您期望看到的更改提交到哪个分支。 - Wim Coenen
我在使用Git+GitHub几年后才开始接触SVN,必须说,一些简单、快速的日常功能突然变得相当复杂! - matth
6个回答

70

在之前的回答中添加(如果在Windows上使用Tortoise SVN):

  • 右键单击任何文件夹,从上下文菜单中选择TortoiseSVN -> Repo-browser
  • URL框中输入您的存储库地址。
  • 导航到您想要比较的第一个文件夹。右键单击并选择标记以进行比较
  • 导航到第二个文件夹。右键单击并选择比较URLs

5
问题没有提到Tortoise SVN或者Windows,因此使用SVN命令行的答案更可取。 - Trebor Rude
谢谢Treb。那是对谈话的有益补充。 - sam-w
在这里查看有关Tortoise SVN的更多详细信息:https://dev59.com/AG445IYBdhLWcg3w1tkS#8822244 - Mark Stewart

9
你可以使用Unix的diff命令来比较目录。
要查找缺失的文件:
diff -r svn/projectX/trunk svn/projectX/branches/stefanl | grep -i only

查找文件之间的区别:

diff -ru svn/projectX/trunk svn/projectX/branches/stefanl

我有同样的问题,在一封邮件中找到了建议: http://svn.haxx.se/users/archive-2003-08/0538.shtml

是的,就是这个。最初问题中缺少的关键是'-r'(递归)标志。这里显示的第二个示例中的'u'标志仅更改diff输出的类型。 - Robert Casey

4

使用:

 svn diff ^/trunkUrl/fileName ^/branchUrl/fileName

这将为您展示分支和主干中文件之间的差异。

3

根据其他答案和一些研究,我写了一个自动完成的脚本。

#!/bin/bash
url=$(svn info | grep ^URL: | sed -e 's,^URL: ,,' )
root=$(svn info | grep '^Repository Root:' | sed -e 's,.*Root: ,,' )
trunk=$root/trunk
if [[ -n "$1" && ! -e "$1" ]]
then
    echo "What? svn diff \"$1\"? really?"
    exit
fi
svn diff $url/$1 $trunk/$1 > trunk.diff

你可以在分支下直接运行它。你可以传递一个路径(目录或文件),然后它将按预期工作。如果没有指定路径,则它只会对比分支和主干代码的差异。

使用XML使其更加可靠:svninfo () { svn info --xml | xmllint --xpath "$1"'/text()' - ; } - ceving
如果分支是从存储库的根目录创建的,则这很好。如果分支是从子目录创建的,则此方法不起作用。因此,您可能需要修改脚本以接受2个参数,并在仅提供一个参数时复制第一个参数。 - Trebor Rude

2
感谢提供的信息,我想补充一些内容以改善差异结果的可读性。如果您使用了以下命令: svn diff svn://url:9090/branches/PRD_0002 svn://url:9090/branches/TST_0003 >svn_diff_filename.txt
您还可以使用以下命令: findstr "Index:" C:\path\svn_diff_filename.txt >svn_diff_file_list.txt
这将为您提供一个可读的文件列表,其中包含任何差异。 祝好, Kra.

1
如果您正在使用Eclipse(或其他IDE)的Subversive插件,请切换到存储库浏览透视图。在SVN存储库面板上,只需右键单击任何项目,然后选择“比较...”选项。从那里开始应该很直观。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接