【问题标题】:Mercurial - View all changesets that modify specific line in fileMercurial - 查看修改文件中特定行的所有变更集
【发布时间】:2013-03-13 22:04:57
【问题描述】:

Annotate 可以让您看到该行的最新更改,如果该更改是合并,那么我别无选择,只能浏览修订历史并查找下一次修改的时间。

我也试过hg grep -l '[contents of line]' 但是:

  • a) 我不知道如何定位特定文件(因此在中等大小的存储库中需要很长时间)
  • b) 似乎只返回最后一个修订号

下面的链接有点类似—— How to find all changsets where a reference to a function was modified?

【问题讨论】:

    标签: mercurial tortoisehg


    【解决方案1】:

    使用 Tortoisehg:

    1. 查看 -> 清单
    2. 右键单击感兴趣的文件,然后单击“文件历史记录”
    3. 点击“用修订号注释”

    顶部面板可让您快速查看文件的提交历史记录,底部面板显示基于顶部面板中所选版本的注释文件。

    【讨论】:

    • 也许是因为我使用的是更高版本的 TortoiseHg (3.2.3),但我不明白这如何帮助隔离单行的更改? (我再也找不到清单选项了,但是从资源管理器/插件上下文菜单中注释文件行为似乎符合这个答案的建议,这就是文件查看各种修订的方式;你仍然必须在每次修订中的问题。)
    【解决方案2】:

    使用没有额外脚本的arielf的响应:

    UNIX:

    • 命令:

        hg log --template '{rev}\n' <FILE> | 
             xargs -I @ hg grep <PATTERN> -r @ <FILE>
      
    • 您可以使用它为您的配置文件 (.hgrc) 添加别名:

        [alias]
        _grep_line_in_history = ! $HG log --template '{rev}\n' $2 | 
             xargs -I @ hg grep '$1' -r @ $2
      

    Windows:

    • 命令:

        FOR /F "usebackq" %i IN (`hg log --template "{rev}\n" <FILE>`) DO
        @(echo %i & hg grep <PATTERN> -r %i <FILE>)
      
    • 别名:

        [alias]
        _grep_line_in_history = ! FOR /F "usebackq" %i IN 
             (`%HG% log --template "{rev}\n" "$2"`) DO @(echo %i & %HG% grep "$1" -r %i "$2")
      

    【讨论】:

      【解决方案3】:

      我认为这需要一些(两步)编程。

      以下 shell 脚本非常适合我。它打印修订和匹配的行。如果您只想要修订列表,您可以添加一个步骤来去除匹配的文本并仅保留修订前缀,并可能通过 'sort -u' 管道:

      #!/bin/bash
      #
      # script to grep for a pattern in all revisions of a file
      # Usage: scriptname 'pattern' filepath
      #
      function fatal() {
          echo "$@" 1>&2
          exit 1
      }
      
      function usage() {
          echo "$@" 1>&2
          fatal Usage: $0 pattern file
      }
      
      case "$1" in
          '') usage 'missing pattern to search for' ;;
          *)  Pat="$1" ;;
      esac
      
      if [ "$2" != '' ]; then
          File="$2"
      else
          usage 'must pass file as 2nd argument'
      fi
      
      # -- generate list of revisions (change-sets) involving $File
      for rev in `hg log --template '{rev}\n' $File`; do
          # -- grep the wanted pattern in that particular revision
          hg grep "$Pat" -r $rev $File
      done
      

      注意事项:

      • 并非完全万无一失(例如,模式中的引号)
      • 我不检查文件是否存在以支持重命名/删除的文件

      【讨论】:

      • 希望有一种更简单的方法来做到这一点。我不使用 TortoiseHg
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-19
      相关资源
      最近更新 更多