问题 在颠覆中看到许多提交的组合差异?


我被要求查看SVN修订号123,178,199,245和288中所做的更改 - 这些是与特定功能相关的所有提交。接近这个的合理方法是什么?我想我真的想以某种方式看到收集的差异,但我愿意接受建议。我们现在正在修订版400。

编辑:我想知道如何在subversion中从命令行做一些事情,但是也欢迎在eclipse或intellij想法(或任何单独的应用程序)中工作的任何解决方案。我也故意开放 什么 我实际上可以希望自动化/获得工具支持,因为我真的不知道如何以聪明的方式做到这一点。


6900
2018-01-21 17:23


起源



答案:


生成五个不同的提交,并将它们全部组合在一起 combinediff 从 patchutils


5
2018-01-21 17:26



这会对同一行代码的重复改变产生影响吗? - krosenvold
真棒!我从来没有听说过Combinediff - orip
> combinediff创建一个统一的差异,表示两个差异的总和。所以我相信是的,它会抑制对同一行代码的相关更改。 - squadette
如果行号发生变化,因为某些其他提交在文件中的其他位置添加或删除了文本,该怎么办? combinediff只有差异的文本可以使用,它不能正确地组合非连续的差异。 - Tgr


答案:


生成五个不同的提交,并将它们全部组合在一起 combinediff 从 patchutils


5
2018-01-21 17:26



这会对同一行代码的重复改变产生影响吗? - krosenvold
真棒!我从来没有听说过Combinediff - orip
> combinediff创建一个统一的差异,表示两个差异的总和。所以我相信是的,它会抑制对同一行代码的相关更改。 - squadette
如果行号发生变化,因为某些其他提交在文件中的其他位置添加或删除了文本,该怎么办? combinediff只有差异的文本可以使用,它不能正确地组合非连续的差异。 - Tgr


在深入了解IntelliJ的想法后,我找到了一个很好的解决方案:

选择版本控制|显示更改视图。

在左侧,选择存储库,然后单击要查看的所有修订。

在右侧窗格中,您将获得受所选修订影响的所有文件的列表。选择“diff”时,您将看到所选变更集中的内部更改。未显示提交中发生的内部重新工作(可以预期)


4
2018-01-22 08:40



如果我投票你,我会。离开我的草坪你该死的孩子该死的孩子!
LOL;)+1注释的bash脚本。 - krosenvold
大声笑+1为好运动
@theman_on_vista刚试过IDEA的解决方案 - 它结合了变更集,而你的脚本只是连接它们。给我一个可以执行此操作的脚本,我将使用命令行:-) - Sasha O
很棒的答案。这就是我在寻找的东西 - NinjaCoder


我问了一个类似的问题 提取代码审查的相关更改 但没有得到满意的答案。我最接近解决方案是做我提到的,创建一个临时分支,然后挑选有趣的提交到临时分支。如果它们结合得很干净,那么可以立即检查整个三角洲。如果他们没有干净地结合并依赖于另一个无关的变化,也许这意味着无论如何都应该立即审查整个批次。


1
2018-01-21 18:30



这是一个不错的解决方案,如果做了很多工作;)有趣的是,为了审查的目的,你通常对有关哪些文件的哪些部分已经改变的信息感到满意 - 真正的差异真的不是我正在寻找的。我将始终重新阅读更改区域中的完整代码。 - krosenvold


即使这个问题已经过去了,我实际上今天写了一个脚本:


#!/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到rev2.log
转2到rev3.log
REV3到rev4.log

1
2018-01-26 16:31



好运动;)+1。是的,我们中的一些人遵循我们的主题;) - krosenvold


bendin的回答 这个 问题有一个函数来打印收集的差异文件的所有修订版本。可以轻松修改它以打印您感兴趣的修订版本的收集差异。


0
2018-01-21 17:27



据我所知,在这个问题上甚至没有任何相关内容,或者我错过了你所看到的东西? - krosenvold
编辑我的回答说明为什么我认为另一个问题是有用的 - Gordon Wilson


您没有指定是否要根据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(尽管原帖从未提及操作系统)


0
2018-01-21 17:44



与此相关的“问题”是我必须查看正在进行的更改/返工的完整历史记录。想象一下,所有五个提交都改变了相同的代码行;当我在阅读代码时,我总是读完整行 - 所以所有早期的变化都可以被压抑。 - krosenvold
我仍然对此感到困惑。如果稍后或更近期的提交解决了这个问题,你为什么要关心中间解决方案(希望并且应该以更好的方式)?
正如你所说的那样,我并不关心在以后的提交中已经改进的东西。如果我将123与HEAD区分开来,我会看到178和HEAD中已经改变的各种事情。但是在123 vs HEAD中也会有一些不会改变的东西。这让我难以置信。 - krosenvold