在Subversion中查看多个提交的合并差异?

14

我被要求审查与特定功能相关的所有提交,这些提交分别在SVN修订号为123、178、199、245和288中。如何合理地处理这个问题?我想以某种方式查看收集的差异,但我愿意听取建议。我们现在的修订版本号是400。

编辑:我想知道如何在subversion的命令行中执行操作,但任何在eclipse或intellij idea(或任何单独的应用程序)中有效的解决方案也可以。我故意开放对于实际上能自动化完成/获得工具支持的内容“是什么”的问题,因为我真的不知道如何以明智的方式做到这一点。

6个回答

6

这会抑制对同一行代码的重复更改吗? - krosenvold
太棒了!我从未听说过combinediff。 - orip
combinediff创建一个统一的差异,表达了两个差异的总和。因此,我相信它会抑制对同一行代码的相关更改。 - squadette
如果由于其他提交在文件的其他位置添加或删除文本而导致行号发生变化怎么办?combinediff 只有 diffs 的文本可以使用,它无法正确地组合非连续的 diffs。 - Tgr

5
在 IntelliJ idea 中搜索后,我找到了一个不错的解决方案:
选择版本控制 | 显示更改视图。
在左侧选择存储库并单击要审查的所有修订版本。
在右侧窗格中,您将获得受选定修订版本影响的所有文件列表。当您选择“差异”时,您将看到所选变更集中的内部更改。提交中发生的内部重构不会显示(这是可以预期的)。

1
如果我可以给你负评,我一定会这么做。离开我的草坪,你们这些该死的孩子们和你们该死的图形用户界面! - theman_on_vista
LOL ;) +1 给这个评论的 bash 脚本。 - krosenvold
@theman_on_vista 刚刚尝试了IDEA的解决方案,它会合并修改集,而你的脚本只是简单地连接它们。给我一个能够做到这一点的脚本,我会使用命令行来执行 :-) - Sasha O
很棒的答案。这正是我在寻找的。 - NinjaCoder

2
我曾经问过一个类似的问题,关于提取有关代码审查的相关更改,但没有得到满意的答案。我想到的最接近的解决方案是,按照我提到的方式创建一个临时分支,并将有趣的提交挑选到该临时分支中。如果它们可以干净地组合在一起,那么整个差异就可以一次性进行审查。如果它们不能干净地组合在一起并依赖于另一个不相关的更改,那么也许意味着整个批次应该一次性进行审查。

这是一个不错的解决方案,但需要做很多工作 ;) 有趣的是,为了审查目的,通常你只需满足于知道哪些文件的哪些部分已更改 - 真正的差异并不是我要寻找的。我总会重新阅读更改区域内的全部代码。 - krosenvold

1
尽管这个问题已经过去很久了,但今天我实际上写了一个脚本,与此类似:

#!/bin/bash

REVISIONS=$@
LAST_REVISION="NULL"
MASTER="master"                             # path to WC

for THIS_REVISION in ${REVISIONS[@]};
do 
    if [ "$LAST_REVISION" != "NULL" ];
    then
        svn diff $MASTER -r ${LAST_REVISION}:${THIS_REVISION} --summarize | while read f;   
        do
            echo ${f#* } | sed "s/[a-zA-Z0-9:\/.]*$MASTER\///" >> "$LAST_REVISION-to-$THIS_REVISION.log"
        done
    fi

    LAST_REVISION=$THIS_REVISION
done

你可以这样调用它:"my_diff_script.sh rev1 rev2 rev3 rev4"

输出将会是:

rev1-to-rev2.log 
rev2-to-rev3.log
rev3-to-rev4.log

0

bendinthis问题的回答中提供了一个函数,用于打印文件所有修订版本的收集差异。它可以轻松修改以打印您感兴趣的修订版本的收集差异。


就我所看到的,那个问题似乎与此毫不相关,或者是我漏看了你所看到的东西? - krosenvold
我编辑了我的回答,说明为什么我认为其他问题是有用的。 - Gordon Wilson

0

您没有指定是基于HEAD还是每个连续的REV编号来生成差异(我不确定为什么您实际上想要这样做?(如果您不是有意提交,请不要提交))。


#!/bin/bash
for revision in 123 178 199 245 288;
do
          svn diff http://path/to/svn/file@HEAD http://path/to/svn/file@$revision > $revision.diff
done

请各位 Windows 粉丝别因为我的回答涉及 bash shell 而不是 Windows shell(尽管原帖从未提到操作系统)而给我点踩。


这个问题在于我必须查看发生的所有更改/重新工作的完整历史记录。想象一下,所有五次提交都改变了相同的代码行; 当我阅读代码时,我总是阅读完整的行 - 因此早期的所有更改都可以被抑制。 - krosenvold
我仍然感到困惑。如果后续或最近的提交解决了问题(希望并应该以更好的方式解决),为什么你还会关心中间解决方案呢? - theman_on_vista
正如您建议的那样,我不关心已经在后续提交中得到改进的内容。如果我比较版本123和头文件(HEAD),我将看到所有在178与头文件(HEAD)之间发生更改的各种事情。但是,在版本123和头文件(HEAD)之间还有一些事情是没有变化的,这让我感到困惑。 - krosenvold

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