搜索颠覆历史(全文)

时间:2008-09-04 17:00:59

标签: svn full-text-search

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

例如,我编写了一个我在某个地方使用过的功能,但之后就不需要了,所以我找了文件,但是现在我需要再次找到它以用于其他东西。 svn日志可能会说“删除未使用过的东西”之类的内容,而且还有大量的签名。

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

16 个答案:

答案 0 :(得分:72)

git svn clone <svn url>
git log -G<some regex>

答案 1 :(得分:39)

Apache Subversion 1.8中的

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

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

请参阅SVNBook | svn log command-line reference

答案 2 :(得分:23)

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

答案 3 :(得分:21)

我正在使用一个小shellcript,但这仅适用于单个文件。您可以将此与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。

答案 4 :(得分:13)

我发现这样做的最好方法是少用:

  

svn log --verbose |少

一旦输入较少,您可以点击/进行搜索,例如VIM。

修改

根据作者的说法,他想要搜索的不仅仅是消息和文件名。在这种情况下,你将被要求与其他类似的东西进行隔离:

svn diff -r0:HEAD | less

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

答案 5 :(得分:9)

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

答案 6 :(得分:7)

svn log -v [repository] > somefile.log

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

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

然后使用vim或nano或任何你喜欢的东西,并搜索你正在寻找的东西。你会很快找到它。

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

答案 7 :(得分:6)

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

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

答案 8 :(得分:4)

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

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

答案 9 :(得分:4)

我刚遇到这个问题并且

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

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

答案 10 :(得分:2)

我对此没有任何经验,但SupoSE(开源,用Java编写)是一个旨在完成此任务的工具。

答案 11 :(得分:2)

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

答案 12 :(得分:1)

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

但是,它要求搜索词当前位于文件系统文件中。对于与文件系统grep匹配的所有文件,然后执行该文件的所有svn diff的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 }'

答案 13 :(得分:0)

我通常做Jack M所说的内容(使用svn log --verbose)但我输入 grep 而不是更少。

答案 14 :(得分:-1)

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

svn blame

信用:original answer

答案 15 :(得分:-3)

我偶然发现了bash script,但我还没试过。