Subversion中特定代码行的更改历史记录


78

是否可以查看Subversion存储库中特定代码行的更改历史记录?

例如,我希望能够看到何时添加了特定语句或何时更改了该语句,即使其行号不再相同。

Answers:


55

我不知道在Subversion中通过时间跟踪语句的方法。

但是,很容易查看使用上次更改文件中的任何特定行的时间svn blame。检查SVNBook:svn blame参考

概要

svn blame TARGET[@REV]...

描述

内联显示指定文件或URL的作者和修订信息。每行文本均以作者(用户名)和对该行的最后更改的修订号开头。


2
您已经解决了OP的问题,但是我仍然想知道是否有某种方法可以跟踪特定行的历史记录-当有太多行和太多修订无法手动查看时。
JohnK

1
许多gui工具(例如tortoiseSVN(在Windows上))在此功能的基础上做得很好,可以让您浏览历史记录。通常突出显示一起更改的所有相邻行,并使其易于进入该差异,然后从较早的修订版中选取相关的行号并重复。我很高兴快速地找到了大型仓库(> 10岁),其中包括从CVS进行的迁移,甚至剪切和粘贴存储库克隆都是历史的一部分。为了实现更高的自动化程度,您可以将存储库导入git并使用其基于内容的高级功能。
morechilli '16

46

TortoiseSVN客户端中,有一个非常不错的功能,可让您:

  • 归咎于文件,显示每行的最后更改(这是标准的)
  • 在上面的视图中单击特定的行之后,“责备先前的修订”(这是很好的)

第二个功能是说的-在行的最后修改之前显示带注释的修订。通过迭代使用此功能,您可以追溯特定行的历史记录。


如果责备不显示行怎么办?我遇到的情况是我搜索特定行的更改。用过的乌龟->责备让修订进行后期修订。在文件中,我可以看到特定的行,很遗憾,我找不到它。
Offler

13

我通常会:

  1. svn blame FILE第一。
  2. 注意特定行的最新修订。
  3. 使用-r参数进行另一个查询:

    svn blame FILE -r 1:REV
    
  4. 从那里手动跟踪。

您可以得到1.和2.结合在一起。svn annotate $file_path | head -n$line_no | tail -1 | awk '{print $1}'
hardmooth '18

4

这可以分两个阶段完成:

  1. svn blame /path/to/your/file > blame.tmp
  2. grep "your_line_of_text" blame.tmp

如果不需要,可以随后删除blame.tmp文件。

原则上,简单的脚本可以用任何大致相同的脚本语言编写。


您不需要这样做。这可以从编辑器本身完成,例如,我使用vim中的VCSAnnotate。并在不离开vim编辑器的情况下拆分并显示了责备输出。其他编辑器也具有类似的插件
KeshV '18

2

这里的关键是需要多少历史记录。正如其他人指出的那样,简短的答案是:(有关详细信息,svn blame请参见svn help blame)。如果您要追溯到很远的历史或要进行重大更改,则可能需要的不仅仅是此命令。

我只需要自己做,然后在SO上找到这个(线程)线程。这是我仅使用来解决此问题的方法CLI,特别是针对我的情况,即API已更改(例如,在将某人的过时工作(不在分支上,arrgh!)移植到一个基于最新版本的功能分支中时)枣树干)。例如,函数名称已更改为足够明显的地方,不清楚需要调用哪个函数。

步骤1

以下命令使我可以浏览文件“ fileName.h”中发生了更改的提交,并查看相应的修订号(注意:根据svn日志文本,您可能必须更改“ 10”以获取更多或更少的上下文) )。

svn log | grep -C 10 "fileName.h" | less

这将导致在其中修改此文件的修订列表。

第二步

然后,使用blame(或像其他人指出的那样annotate)缩小到感兴趣的修订范围很简单。

cd trunk
svn blame fileName.h@r35948 | less

例如,发现利息的修订为35948。

第三步

通过指责找到了感兴趣的修订后,就可以产生一个差异来利用SVN工具。

svn diff -r35948:PREV fileName.h

结论

具有视觉差异使得通过更新/更新的API名称更容易识别旧的API名称。


对于我的特定情况,如果您很幸运,并且使用的日志中具有良好的提交消息的代码,您甚至可以grep使用旧的API /函数名称,并找到一条注释,例如“将func_FindParm更改为func_GetParm ” 。
tniles

2

Eclipse中可以知道,当你的代码的每一行已经使用SVN注释视图,或者在文件→右键致力于团队注解显示...




0

一个开始就是命令svn责备(或注释,赞美)。它会显示代码行的最后修改时间以及修改的人。例如:

  4564    wiemann # $Id$
  4564    wiemann # Author: David Goodger <goodger@python.org>
   778    goodger # Copyright: This module has been placed in the public domain.
   217    goodger 

0

如果使用Emacs,则内置软件包vc可以执行此操作。

  1. 导航到有问题的文件。
  2. vc-annotate使用M-x vc-annotate或运行命令C-xvg
  3. 每行都会显示其修订版本,就像正常的一样svn blame
  4. avc-annotate-revision-previous-to-line)将导航到您所在行的修订版本之前的修订版本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.