2008-09-04 84 views
115

有没有一种方法可以执行包括所有历史记录在内的Subversion版本库的全文搜索?例如,我写了一个功能,我使用了某个地方,但这不是必需的,所以我svn rm'd这些文件,但现在我需要再次找到它来用于别的东西。 svn日志可能会提示“删除未使用的东西”,并且有很多类似的checkin。搜索颠覆历史(全文)

编辑2016年4月15日:请注意,这是怎么问的术语“全文搜索”,就是搜索提交历史实际的diff,而不是文件名和/或提交信息 。我指出了这一点,因为作者上面的措辞并没有很好地反映出来 - 因为在他的例子中,他可能只是在寻找文件名和/或提交信息。因此很多svn log的答案和评论。

+5

的Apache Subversion的1.8接受`svn log`命令的`--search`参数。在http://stackoverflow.com/a/17473516/761095查看我的答案 – bahrep 2013-07-04 15:06:13

+1

`svn log --search`不执行@rjmunro所要求的全文搜索,但只搜索作者,日期,日志消息和改变路径。 – zb226 2016-04-15 10:25:54

回答

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

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

9

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

+0

我已经使用OpenGrok好几个月了,它很有趣。 – 2008-09-29 16:16:38

11

我发现做到这一点,最好的办法是用更少:

SVN日志--verbose |更少

一旦少了一个输出,您可以按/搜索,如VIM。

编辑:

据笔者,他要寻找的不仅仅是邮件和文件名的更多。在这种情况下,您将需要的东西,如一起贫民窟本事:

svn diff -r0:HEAD | less 

您也可以替代grep或其他事情做搜索你。如果要在存储库的子目录中使用此目录,则需要使用svn log来识别该目录存在的第一个修订版本,并使用该修订版而不是0

+4

这不是全文搜索,而是搜索日志和文件名。 – rjmunro 2008-09-07 14:09:22

+0

如果是这样,那么你需要使用更多富有表现力的提交日志。如果你想弄清修订之间的区别,那就是整个蜡的其他球。我个人不知道这样做的方法。 – 2009-03-23 18:11:56

+0

> svn diff -r0:HEAD> log > less log 是我在windows上的选择。谢谢 – kingoleg 2016-04-11 14:57:37

0

我通常做什么Jack M说(使用svn日志--verbose),但我管grep而不是更少。

+5

这不是全文搜索,而是搜索日志和文件名。 – rjmunro 2008-09-07 14:07:22

+0

这就是我通常最终做的事情,但我发现使用`less`你可以看到修订,日期等,而不是评论中的行。无论如何,这通常是我正在寻找的。 – 2009-03-23 18:10:07

22

如果您运行的是Windows看看SvnQuery。它维护本地或远程存储库的全文索引。曾经提交到存储库的每个文档都被编入索引。您可以从简单的Web界面进行类似谷歌的查询。

+0

如果SvnQuery仍然保持不变,但很可惜它会死,现在它根本不起作用。 – 2015-08-06 17:17:01

21

我正在使用一个小的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 

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

+2

用于管理转储指针的+1。 – akuhn 2010-01-26 10:44:08

+0

我必须使用awk'{print substr($ 1,2,length($ 1))}'删除修订版本号中的“r”,并移除grep“-q”选项以实际显示匹配项。 – Hugo 2010-12-06 13:57:22

+0

字符串myDump.txt | grep“turtle fwd 10” – jedierikb 2012-07-14 02:31:57

2

我只是碰到了这个问题,并

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

做的工作对我来说。返回第一次出现的修订并引用了我正在查找的行。

1

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

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

在/ usr/local/bin目录/ svngrep

#!/bin/bash 
# Usage: svngrep $regex @grep_args 

regex="[email protected]" 
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="[email protected]" 
    svn log "$file" 2> /dev/null | awk '/^r[[:digit:]]+ \|/ { sub(/^r/,"",$1); print $1 }' 
-3

我碰到这个bash script,但我还没有尝试过。

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

版本比较,你可以使用--diff选项

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

然后使用vim或者nano或任何你喜欢使用,并做你正在寻找一个搜索。你会很快找到它。

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

2

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

-1

如果你正试图确定哪个版本是负责特定的代码行,你可能正在寻找:

svn blame 

信用:original answer