Svn 如何找到移动了一行代码的文件的哪个版本?

Svn 如何找到移动了一行代码的文件的哪个版本?,svn,tortoisesvn,visualsvn-server,Svn,Tortoisesvn,Visualsvn Server,我使用的是VisualSVN服务器和TortoiseSVN,我试图在特定文件的多个版本中找到特定行的显示位置 我试图看看在过去的修订版中,save(12)出现,并与我的工作副本相比,在其中移动了它 r1和我的工作副本之间的统一差异仅显示初始位置。我尝试过单独查看差异,但有数百个修订 有什么方法可以做到这一点吗?如果您对文件的当前修订版运行TortoiseSVN责怪工具,您应该会看到该行变成现在的修订版(以及是谁做的)。这可以手动完成,也可以使用脚本自动完成,并分阶段工作,但您会惊讶于速度有多快:

我使用的是VisualSVN服务器和TortoiseSVN,我试图在特定文件的多个版本中找到特定行的显示位置

我试图看看在过去的修订版中,
save(12)出现,并与我的工作副本相比,在其中移动了它

r1和我的工作副本之间的统一差异仅显示初始位置。我尝试过单独查看差异,但有数百个修订


有什么方法可以做到这一点吗?

如果您对文件的当前修订版运行TortoiseSVN责怪工具,您应该会看到该行变成现在的修订版(以及是谁做的)。

这可以手动完成,也可以使用脚本自动完成,并分阶段工作,但您会惊讶于速度有多快:

  • 编写一个grep命令,如果行在一个位置,而在另一个位置失败,则通过该命令-例如grep-n“行的文本”filename.ext|grepCurrentLineNo
  • 假设您有1000个可能的修订版本,这应该在1000通过,在0失败
  • 将一个文件更新为rev 500并再次运行-如果通过,则向下运行失败,在任何一种情况下都向上运行您使用的文件与之前的文件相差一半,并继续执行相同的操作,即250、125、62、31、15、7、4、2、1-在此过程结束时-(二进制搜索)-您将有两个相邻的文件修订1通过1失败-在10个步骤中,1000个修订20个百万

  • 前言

    • 在diff中“字符串的首次出现”是在diff输出中“+字符串”的首次出现
    • 根据差异(假设新行不在差异上下文中/3行作为默认行/旧行)在同一差异中显示“-string”和“+string”
    还没有准备好使用代码,但有肮脏的想法草案

    纯颠覆方式

    这种方法(至少)有两种方法:自上而下用责备和自下而上用log+diff来探究历史

    责备方法1)
    svn责备文件>责备文件
    ,2)在责备文件字符串中查找“保存(12)”,注意字符串编号(任何方式)和上次更改的修订(第一列)版本3)在历史中向后移动
    svn责备-r修订文件>责备文件

    重复步骤2-3,同时a)更改“保存(12)”的字符串编号不会显示“移动修订”(它在行中是上一个,而不是当前版本)b)文件中的修订版本将等于当前版本-其显示“保存(12)”的修订版本

    Log+diff方法1)
    svn Log-q-v文件
    (获取以任何形式影响文件的修订列表)2)对于列表中的每个修订,执行
    svn diff-c REV | grep save(12)>FILE-REV
    从最旧到最新的修订方向3)查找与序言中第二个注释相关的修订,检查FILE-REV

    Mercurial+hgsubversion方式

    在当地材料上测试。我想查看文件中“Region=-MA”行的历史记录

    在修订版597(SVN编号为598,+1)的字符串26中出现了一条命令,该命令的答案为“
    Region=-MA
    string”。在修订版598中,字符串被移动到字符串24”,并由DIFF确认

    597(新增档案)

    598

    为什么我使用子字符串而不是全字符串?只是因为在满字符串的情况下,我得到了奇怪和意外的结果(与之前的grep相比)


    您错过了历史方面的要求-因此,必须在循环中执行责备,使用有问题字符串的修订作为新源修订如果对该行的最后更改是移动,它将显示为责备工具显示最后修订的who行格式。您好Steve,谢谢您,但它没有完全显示我在追求什么。从最新版本开始,它在当前状态下只显示一次该行。我认为@lazybager是对的。顺便说一句,git和mercurial等分布式VCS可以选择自动执行此操作。
    >hg grep --all -n Region Charter.ini
    Charter.ini:599:28:+:Region=-NE
    Charter.ini:598:23:-:Region=
    Charter.ini:598:26:-:Region=-MA
    Charter.ini:598:24:+:Region=-MA
    Charter.ini:597:13:+:Region=-MI
    Charter.ini:597:16:+:Region=-GA
    Charter.ini:597:19:+:Region=-CA
    Charter.ini:597:23:+:Region=
    Charter.ini:597:26:+:Region=-MA
    
    >hg diff -c 597 Charter.ini
    diff -r 7e3dfc891358 -r 25efa70e5350 Charter.ini
    --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
    +++ b/Charter.ini       Tue Dec 29 08:27:48 2009 +0000
    ...
    +Region=-MA
    +75.130.96.0-75.130.111.255
    
    >hg diff -c 598 Charter.ini
    diff -r 25efa70e5350 -r 5665435f74b4 Charter.ini
    --- a/Charter.ini       Tue Dec 29 08:27:48 2009 +0000
    +++ b/Charter.ini       Tue Dec 29 13:09:58 2009 +0000
    ...
    -//CHARTER-NET-5BLK
     66.188.0.0-66.191.255.255
    +71.80.0.0-71.95.255.255
    +75.128.0.0-75.143.255.255   
    ...
    -
    -//NETBLK-CHARTER-NET
    -Region=
    -75.128.0.0-75.143.255.255
    +71.84.32.0-71.84.63.255
    
     Region=-MA
     75.130.96.0-75.130.111.255
    
    >hg grep --all -n Region=-MA Charter.ini
    Charter.ini:597:26:+:Region=-MA