有没有办法对subversion存储库执行全文搜索,包括所有历史记录?
例如,我编写了一个我在某个地方使用过的功能,但之后就不需要了,所以我对这些文件进行了调整,但现在我需要再次找到它以将其用于其他内容。 svn日志可能会说"删除未使用的东西"之类的内容,并且有大量的签名。
编辑2016-04-15:请注意,术语"全文搜索"在这里提到的是搜索提交历史的实际差异,而不是文件名和/或提交消息。 我指出这一点是因为上面的作者的措词并没有很好地反映出来 - 因为在他的例子中他也可能只是寻找文件名和/或提交消息。 因此很多svn log的答案和评论。
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而不是更少。
如果您要确定哪个版本负责特定的代码行,您可能正在寻找:
信用:原始答案
我遇到过这个bash脚本,但我还没有尝试过。