【问题标题】:Searching subversion history (full text)搜索颠覆历史(全文)
【发布时间】:2010-09-07 20:01:45
【问题描述】:

有没有办法对 subversion 存储库执行全文搜索,包括所有历史记录?

例如,我编写了一个我在某处使用过的功能,但后来不需要它,所以我对文件进行了 svn rm 处理,但现在我需要再次找到它以将其用于其他用途。 svn 日志可能会说“删除了未使用的东西”之类的内容,并且有很多这样的签入。

编辑 2016-04-15: 请注意,此处“全文搜索”一词所要求的是搜索提交历史记录的实际差异,而不是文件名和/或提交消息。我指出这一点是因为作者上面的措辞并没有很好地反映这一点——因为在他的例子中,他可能只是在寻找文件名和/或提交消息。因此有很多 svn log 答案和 cmets。

【问题讨论】:

  • Apache Subversion 1.8 接受 --search 参数作为 svn log 命令。在stackoverflow.com/a/17473516/761095查看我的回答
  • svn log --search 不执行@rjmunro 要求的全文搜索,而只搜索作者、日期、日志消息和更改路径列表。

标签: svn full-text-search


【解决方案1】:

我对此没有任何经验,但 SupoSE(开源,用 Java 编写)是专门为实现此目的而设计的工具。

【讨论】:

    【解决方案2】:

    我一直在寻找类似的东西。我想出的最好的是OpenGrok。我还没有尝试实现它,但听起来很有希望。

    【讨论】:

    • 我已经使用 OpenGrok 好几个月了,它非常棒。
    【解决方案3】:

    我发现做到这一点的最好方法是少用:

    svn 日志 --verbose |少

    一旦有输出,你可以点击/进行搜索,如VIM。

    编辑:

    根据作者的说法,他想要搜索的不仅仅是消息和文件名。在这种情况下,您将需要将其与以下内容一起进行 ghetto-hack:

    svn diff -r0:HEAD | less
    

    您也可以替换grep 或其他东西来为您搜索。如果您想在存储库的子目录中使用它,您将需要使用 svn log 来识别该目录存在的第一个修订版,并使用该修订版而不是 0

    【讨论】:

    • 这不是全文搜索,而是搜索日志和文件名。
    • 如果是这种情况,那么您需要使用更具表现力的提交日志。如果您想区分修订版之间的差异,那就是另一个蜡球。我个人不知道如何做到这一点。
    • > svn diff -r0:HEAD > log > less log 是我在 Windows 上的选择。谢谢
    【解决方案4】:

    我通常按照Jack M 所说的去做(使用 svn log --verbose),但我使用管道传送到 grep 而不是 less。

    【讨论】:

    • 这不是全文搜索,而是搜索日志和文件名。
    • 这是我通常最终会做的事情,但我发现使用less 您实际上可以看到修订、日期等,而不仅仅是评论中的行。无论如何,这通常是我正在寻找的。​​span>
    【解决方案5】:

    我一直在寻找同样的东西,发现了这个:

    http://svn-search.sourceforge.net/

    【讨论】:

      【解决方案6】:

      如果您运行的是 Windows,请查看 SvnQuery。它维护本地或远程存储库的全文索引。曾经提交到存储库的每个文档都会被编入索引。您可以通过简单的网络界面进行类似 google 的查询。

      【讨论】:

      【解决方案7】:

      我正在使用一个小的 shellscript,但这仅适用于单个文件。您当然可以将它与 find 结合使用以包含更多文件。

      #!/bin/bash
      for REV in `svn log $1 | grep ^r[0-9] | awk '{print $1}'`; do 
        svn cat $1 -r $REV | grep -q $2
        if [ $? -eq 0 ]; then 
          echo "$REV"
        fi 
      done
      

      如果您真的想搜索所有内容,请使用 svnadmin dump 命令并通过 grep 搜索。

      【讨论】:

      • 我不得不从修订号中删除“r”: awk '{print substr($1,2,length($1))}' 并删除 grep "-q" 选项,实际上显示匹配项。
      • 字符串 myDump.txt | grep "乌龟 fwd 10"
      • 这就是我们拥抱 git 的原因。
      • 可能要执行最后一个 grep -i 忽略大小写并删除 -q 以实际查看匹配的行
      【解决方案8】:

      虽然不是免费的,但您可以看看 Atlassian 的 Fisheye,这些人为您带来了 JIRA。它使用许多其他有用的功能对 SVN 进行全文搜索。

      http://www.atlassian.com/software/fisheye/

      【讨论】:

      • Fisheye 不错。正如你所说,不是免费的,但
      • 目前,5 个用户是 10 美元,但只有 10 个用户,它会跳到 1000 美元!
      【解决方案9】:

      我刚刚遇到了这个问题

      svnadmin dump <repo location> |grep -i <search term>
      

      为我完成了这项工作。返回第一次出现的修订版并引用了我正在寻找的行。

      【讨论】:

      • 仅在本地工作,如果存储库很大,将花费大量时间。
      【解决方案10】:
      git svn clone <svn url>
      
      git log -G<some regex>
      

      【讨论】:

      • 请注意,这可能需要一段时间,具体取决于存储库的大小。对我来说花了一个多小时。
      • 我对这个解决方案投了反对票,因为将大型 SVN 存储库转换为 GIT 通常不可行,或者需要很长时间。这就像在对 C# 语言结构有疑问时推荐 Java。
      • 您可能需要为此命令安装额外的软件包。在 Ubuntu 上,你想apt-get install git-svn
      • 不使用“svn log --verbose --diff | grep ...”购买你大致相同的功能而不必使用git?
      • @lyte 功能大致相同。到目前为止,您单独使用 svn 非常好。我觉得利用 git 搜索提交的想法很荒谬。当您想查看的不仅仅是包含您搜索的术语的行时,麻烦就开始了。 grep 可以在查找结果之前和之后打印多行,但您永远不知道需要多少行(在顶部查找修订号或在底部查找整个注释)。输出很难阅读。
      【解决方案11】:

      我把它写成一个 cygwin bash 脚本来解决这个问题。

      但是,它要求搜索词当前位于文件系统文件中。对于与文件系统 grep 匹配的所有文件,然后执行该文件的所有 svn 差异的 grep。不完美,但对于大多数用途来说应该足够好。希望这会有所帮助。

      /usr/local/bin/svngrep

      #!/bin/bash
      # Usage: svngrep $regex @grep_args
      
      regex="$@"
      pattern=`echo $regex | perl -p -e 's/--?\S+//g; s/^\\s+//;'` # strip --args
      if [[ ! $regex ]]; then
          echo "Usage: svngrep \$regex @grep_args"
      else 
          for file in `grep -irl --no-messages --exclude=\*.tmp --exclude=\.svn $regex ./`;     do 
              revs="`svnrevisions $file`";
              for rev in $revs; do
                  diff=`svn diff $file -r$[rev-1]:$rev \
                       --diff-cmd /usr/bin/diff -x "-Ew -U5 --strip-trailing-cr" 2> /dev/null`
                  context=`echo "$diff" \
                       | grep -i --color=none   -U5 "^\(+\|-\).*$pattern" \
                       | grep -i --color=always -U5             $pattern  \
                       | grep -v '^+++\|^---\|^===\|^Index: ' \
                       `
                  if [[ $context ]]; then
                      info=`echo "$diff" | grep '^+++\|^---'`
                      log=`svn log $file -r$rev`
                      #author=`svn info -r$rev | awk '/Last Changed Author:/ { print $4 }'`; 
      
                      echo "========================================================================"
                      echo "========================================================================"
                      echo "$log"
                      echo "$info"
                      echo "$context"
                      echo
                  fi;
              done;
          done;
      fi
      

      /usr/local/bin/svnrevisions

      #!/bin/sh
      # Usage:  svnrevisions $file
      # Output: list of fully numeric svn revisions (without the r), one per line
      
      file="$@"
          svn log "$file" 2> /dev/null | awk '/^r[[:digit:]]+ \|/ { sub(/^r/,"",$1); print  $1 }'
      

      【讨论】:

      • 'A' 努力! (只需使用 git :))
      【解决方案12】:

      我遇到了这个bash script,但我没有尝试过。

      【讨论】:

        【解决方案13】:

        Apache Subversion 1.8 中的svn log 支持a new --search option。因此,您无需使用第三方工具和脚本即可搜索 Subversion 存储库历史日志消息。

        svn log --search 搜索作者、日期、日志消息文本和更改路径列表。

        SVNBook | svn log command-line reference

        【讨论】:

        • 方便,但不是全文搜索。我坚持使用 git-svn 答案:-)
        • 不是说目前 googlecode 上的 svn repos 仍在 svn 1.6 上运行...见:code.google.com/p/support/wiki/…?但是,将您的客户端更新到 1,8(以及任何签出的 repo 的 svn 升级)将允许您在 repo 上使用 svn log --search ...
        • 工作副本需要所有更新,但此命令列出了整个更改,包括修订号、更改的文件和注释。怎么不是全文?
        【解决方案14】:
        svn log -v [repository] > somefile.log
        

        对于差异,您可以使用 --diff 选项

        svn log -v --diff [repository] > somefile.log
        

        然后使用 vim 或 nano 或任何您喜欢使用的东西,然后搜索您要查找的内容。你会很快找到它。

        这不是一个花哨的脚本或任何自动化的东西。但它有效。

        【讨论】:

        • AFAICS,这将搜索提交消息,而不是实际的差异。
        • 然后使用 svn log -v --diff [repository] ​​> somefile.log
        • 或者只是像 zednight 的回答那样通过 grep 管道
        【解决方案15】:

        svn log -l&lt;commit limit&gt; | grep -C&lt;5 or more lines&gt; &lt;search message&gt;

        【讨论】:

        • 添加 --diff 以获取更改的文本搜索
        【解决方案16】:

        如果您试图确定哪个版本负责特定的代码行,您可能正在寻找:

        svn blame
        

        信用:original answer

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-10-12
          • 2012-12-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-13
          • 2011-05-11
          • 2015-09-03
          • 2012-01-10
          相关资源
          最近更新 更多