search颠覆历史(全文)

有没有办法执行一个Subversion版本库的全文search,包括所有的历史?

例如,我写了一个function,我用在某个地方,但不需要,所以我svn rm'd文件,但现在我需要find它再次使用它的东西。 svn日志可能会说“删除未使用的东西”,并有像这样的签入负载。

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

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

svn log Apache Subversion 1.8支持一个新的--search选项 。 所以你可以在不使用第三方工具和脚本的情况下searchSubversion版本库历史日志消息。

svn log --searchsearch作者,date,日志消息文本和更改path列表。

请参阅SVNBook | svn log命令行参考 。

如果你正在运行Windows,请看看SvnQuery 。 它维护本地或远程存储库的全文索引。 曾经被提交给一个仓库的每个文档都被编入索引。 你可以做一个简单的networking界面谷歌般的查询。

我正在使用一个小的shellcript,但这只适用于单个文件。 你可以将这个与发现结合起来,包括更多的文件。

 #!/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 

如果你真的想search一切,使用svnadmin dump命令和grep通过。

我发现这样做的最好办法是减less:

svn日志–verbose | 减

一旦less了输出,你可以打/search,如VIM。

编辑:

据作者说,他想要search的不仅仅是信息和文件名。 在这种情况下,你将被要求贫民窟 – 一起类似的东西:

 svn diff -r0:HEAD | less 

你也可以用grep或其他东西来替代你。 如果要在存储库的子目录上使用它,则需要使用svn log来识别该目录所在的第一个修订版本,并使用该修订版而不是0

我一直在寻找类似的东西。 我已经想出了最好的OpenGrok 。 我还没有尝试过,但听起来很有希望。

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

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

 svn log -v [repository] > somefile.log 

为diff可以使用--diff选项

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

然后使用vim或者nano或者任何你喜欢使用的,并且search你正在寻找的东西。 你会发现很快。

这不是一个奇特的脚本或任何自动化。 但它的作品。

我正在寻找同样的事情,发现这一点:

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

我没有任何经验,但SupoSE (开源,用Java编写)是一个专门用来做这件事的工具。

我刚碰到这个问题

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

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

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

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

但是它要求search词当前在文件系统文件中。 对于与文件系统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 }' 

我通常做什么杰克M说(使用svn日志–verbose),但我pipe道grep而不是less。

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

 svn blame 

信用: 原来的答案

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