【问题标题】:History of changes to a particular line of code in SubversionSubversion 中特定代码行的更改历史
【发布时间】:2008-09-10 08:32:20
【问题描述】:

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

例如,我希望能够查看添加特定语句或更改该语句的时间,即使它的行号不再相同。

【问题讨论】:

    标签: svn


    【解决方案1】:

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

    但是,使用svn blame 查看文件中任何特定行的最后更改时间很简单。查看SVNBook:svn blame reference:

    概要

    svn blame TARGET[@REV]...
    

    说明

    显示指定文件或 URL 的内嵌作者和修订信息。每一行文本的开头都带有作者(用户名)和该行最后一次更改的修订号。

    【讨论】:

    • 您已经解决了 OP 的问题,但我仍然想知道是否有某种方法可以跟踪特定行的历史记录——当行数过多且需要手动查看的修订过多时.
    • 许多 gui 工具,例如tortoiseSVN(在 Windows 上)很好地构建了此功能,让您了解历史。通常突出显示任何一起更改的相邻行并使其易于进入该差异,然后从早期版本中选择相关的行号并重复。我很高兴快速地追踪了大型存储库(> 10 岁),其中包括从 CVS 迁移,甚至剪切和粘贴存储库克隆作为历史的一部分。为了实现更多自动化,也许您可​​以将 repo 导入 git 并使用其更高级的基于内容的责备功能。
    【解决方案2】:

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

    • 责备文件,显示每行的最后更改(这是标准)
    • “责备以前的修订版”,点击上面视图中的特定行后(这是好的)

    第二个功能正如它所说的那样 - 它显示了在对行的最后修改之前的带注释的修订。通过反复使用此功能,您可以追溯特定行的历史记录。

    【讨论】:

    • 如果责备不显示行怎么办?我有这样的情况,我搜索特定行的更改。 used tortoise->blame Let revision on lates revision。在文件中我可以看到一个特定的行,因为我找不到它。
    【解决方案3】:

    我通常会:

    1. 先运行svn blame FILE
    2. 注意特定行的最新版本。
    3. 使用-r 参数执行另一个查询:

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

    【讨论】:

    • svn annotate $file_path | head -n$line_no | tail -1 | awk '{print $1}'中可以得到1.和2.的组合
    【解决方案4】:

    这可以分两个阶段完成:

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

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

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

    【讨论】:

    • 你不需要这样做。这可以从编辑器本身完成,例如我使用来自 vim 的 VCSAnnotate。它在不离开 vim 编辑器的情况下拆分并显示责备输出。其他编辑器也有类似的插件
    【解决方案5】:

    这里的关键是需要多少历史记录。正如其他人指出的那样,简短的回答是:svn blame(有关详细信息,请参阅svn help blame)。如果您要追溯历史或处理重大变化,您可能需要的不仅仅是这一条命令。

    我只需要自己做这件事,并在 SO 上找到了这个(ye ole)线程。以下是我仅使用 CLI 解决它的方法,特别是针对我的 API 已更改的情况(例如,在将某人过时的工作(不在分支上,arrgh!)移植回基于最新主干的功能分支)。例如。函数名称已经发生了足够的变化,以至于不清楚需要调用哪个函数。

    第一步

    以下命令允许我浏览文件“fileName.h”中发生更改的提交并查看相应的修订号(注意:您可能需要根据您的svn 日志文本)。

    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”的评论。
    【解决方案6】:

    Eclipse 中,您可以使用 SVN 注释视图了解您的代码的每一行何时提交,或者右键单击文件 → 团队显示注释...。

    【讨论】:

      【解决方案7】:
      svn annotate
      

      来自TortoiseSVN的AKA SVN Blame

      【讨论】:

        【解决方案8】:

        svn blame 显示上次哪个签入修改了文件中的任何行。

        这也适用于旧版本。

        【讨论】:

          【解决方案9】:

          开始是命令svn blame(或annotate,praise)。它将显示最后一次修改代码行的时间以及修改者。例如:

            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 
          

          【讨论】:

            【解决方案10】:

            如果你使用 Emacs,内置包 vc 可以做到这一点。

            1. 导航到相关文件。
            2. 使用 M-x vc-annotateC-xvg 运行命令 vc-annotate。李>
            3. 每一行都会显示其修订版本,就像普通的svn blame
            4. a (vc-annotate-revision-previous-to-line) 将导航到您所在行的修订之前的修订。

            【讨论】:

              【解决方案11】:

              您要查找的命令是svn blame

              【讨论】:

                猜你喜欢
                • 2012-11-13
                • 2013-04-02
                • 1970-01-01
                • 2013-06-06
                • 1970-01-01
                • 2010-10-24
                • 1970-01-01
                • 2014-01-13
                • 1970-01-01
                相关资源
                最近更新 更多