Searching subversion history (full text)
有没有办法对subversion存储库执行全文搜索,包括所有历史记录?
例如,我编写了一个我在某个地方使用过的功能,但之后就不需要了,所以我对这些文件进行了调整,但现在我需要再次找到它以将其用于其他内容。 svn日志可能会说"删除未使用的东西"之类的内容,并且有大量的签名。
编辑2016-04-15:请注意,术语"全文搜索"在这里提到的是搜索提交历史的实际差异,而不是文件名和/或提交消息。 我指出这一点是因为上面的作者的措词并没有很好地反映出来 - 因为在他的例子中他也可能只是寻找文件名和/或提交消息。 因此很多
1 | git svn clone <svn url> |
1 | git log -G<some regex> |
Apache Subversion 1.8中的
见SVNBook |
如果您正在运行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 |
如果你真的想要搜索所有内容,请使用
我发现这样做的最好方法是:
svn log --verbose | less
一旦产生较少的输出,你可以点击
编辑:
根据作者的说法,他想要搜索的不仅仅是消息和文件名。在这种情况下,您需要与以下内容一起进行密集攻击:
1 | svn diff -r0:HEAD | less |
您也可以替换
我一直在寻找类似的东西。我提出的最好的是OpenGrok。我还没有尝试过实现它,但听起来很有希望。
1 | svn log -v [repository] > somefile.log |
对于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编写)是一个旨在实现这一目标的工具。
我把它写成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脚本,但我还没有尝试过。