关于svn:搜索颠覆历史(全文)

关于svn:搜索颠覆历史(全文)

Searching subversion history (full text)

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

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

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


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

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

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

见SVNBook | svn log命令行参考。


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


我使用的是一个小shellcript,但这仅适用于单个文件。您可以将此与find结合使用以包含更多文件。

1
2
3
4
5
6
7
#!/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进行搜索。


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

svn log --verbose | less

一旦产生较少的输出,你可以点击/进行搜索,就像VIM一样。

编辑:

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

1
svn diff -r0:HEAD | less

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


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


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

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

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

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

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


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

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


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

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


我刚遇到这个问题而且

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

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


我对它没有任何经验,但是SupoSE(开源,用Java编写)是一个旨在实现这一目标的工具。


svn log -l | grep -C<5 or more lines>


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

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

在/ usr / local / bin目录/ svngrep

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#!/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

1
2
3
4
5
6
#!/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 }'

我通常做杰克M所说的(使用svn log --verbose),但我管道grep而不是更少。


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

1
svn blame

信用:原始答案


我遇到过这个bash脚本,但我还没有尝试过。


推荐阅读