代码之家  ›  专栏  ›  技术社区  ›  MadPhysicist

在svn文件的历史记录中搜索特定字符串

  •  0
  • MadPhysicist  · 技术社区  · 7 年前

    是否有方法对Subversion存储库执行全文搜索,包括所有历史记录?

    例如,我写了一个我在某个地方使用过的特性,但后来不需要了,所以我保存了这些文件,但现在我需要再次找到它来将其用于其他用途。svn日志可能会说“删除了未使用的东西”,并且有很多这样的签入。

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

    0 回复  |  直到 9 年前
        1
  •  72
  •   rjmunro    10 年前
    git svn clone <svn url>
    
    git log -G<some regex>
    
        2
  •  39
  •   bahrep Ahamed    11 年前

    svn log 在apache subversion 1.8中支持 a new --search option . 因此,您可以在不使用第三方工具和脚本的情况下搜索Subversion存储库历史日志消息。

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

    SVNBook | svn log command-line reference .

        3
  •  23
  •   Christian Rodemeyer    17 年前

    如果你在运行windows,看看 SvnQuery . 它维护本地或远程存储库的全文索引。提交到存储库的每个文档都会被编入索引。您可以从一个简单的web界面执行类似google的查询。

        4
  •  21
  •   Bas Grolleman    16 年前

    我正在使用一个小的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 命令和格雷普通过。

        5
  •  13
  •   Jack M.    17 年前

    我发现最好的方法是用更少的:

    SVN日志——无冗余

    一旦产量减少,你就可以 / 像维姆一样搜索。

    编辑:

    据作者说,他想搜索的不仅仅是信息和文件名。在这种情况下,你将被要求与以下类似的东西一起破解:

    svn diff -r0:HEAD | less
    

    你也可以用 grep 或者其他什么东西来寻找你。如果要在存储库的子目录上使用此命令,则需要使用 svn log 识别目录所在的第一个修订版,并使用该修订版而不是 0 .

        6
  •  9
  •   alanc    13 年前

    我一直在找类似的东西。我想到的最好的办法是 OpenGrok . 我还没有试着去实现它,但听起来很有希望。

        7
  •  7
  •   JREN Sharon Haim Pour    10 年前
    svn log -v [repository] > somefile.log
    

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

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

    然后使用vim或nano或任何你喜欢使用的工具,并搜索你想要的东西。你会很快找到的。

    这不是一个花哨的脚本或任何自动化的东西。但它起作用了。

        8
  •  6
  •   mrjabba    16 年前

    虽然不是免费的,但你可以看看来自阿特拉斯的Fisheye,也就是那些带给你Jira的人。它使用许多其他有用的特性对svn进行全文搜索。

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

        9
  •  4
  •   Alex    17 年前

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

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

        10
  •  4
  •   pfyon    15 年前

    我刚碰到这个问题

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

    为我做的工作。返回第一次出现的修订并引用了我正在查找的行。

        11
  •  2
  •   dF.    17 年前

    我没有任何经验,但是 SupoSE (开源,用Java编写)是一个设计来做到这一点的工具。

        12
  •  2
  •   zednight    9 年前

    svn log -l<commit limit> | grep -C<5 or more lines> <search message>

        13
  •  1
  •   James McGuigan    14 年前

    我将此作为cygwin bash脚本编写以解决此问题。

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

    /USR/本地/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/本地/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 }'
    
        14
  •  0
  •   Community Mohan Dere    9 年前

    我通常做什么 Jack M 说(使用svn log--verbose),但我管道到 格雷普 而不是更少。

        15
  •  -1
  •   Community Mohan Dere    9 年前

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

    svn blame
    

    信用: original answer

        16
  •  -3
  •   Stephan    13 年前

    我碰到这个 bash script ,但我没有试过。