Svn 搜索颠覆历史(全文)

Svn 搜索颠覆历史(全文),svn,full-text-search,Svn,Full Text Search,有没有办法对subversion存储库执行全文搜索,包括所有历史记录 例如,我写了一个我在某处使用过的功能,但后来它不需要了,所以我对文件进行了svn rm,但现在我需要再次找到它以用于其他用途。svn日志可能会说“删除了未使用的东西”,并且有大量这样的签入 编辑2016-04-15:请注意,这里“全文搜索”一词的要求是搜索提交历史的实际差异,而不是文件名和/或提交消息。我指出这一点是因为作者上面的措辞并没有很好地反映这一点,因为在他的示例中,他可能只是在寻找文件名和/或提交消息。因此,svn日

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

例如,我写了一个我在某处使用过的功能,但后来它不需要了,所以我对文件进行了svn rm,但现在我需要再次找到它以用于其他用途。svn日志可能会说“删除了未使用的东西”,并且有大量这样的签入


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

我对它并没有任何经验,但(开源,用Java编写)正是一个专门为此设计的工具。

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

我发现实现这一点的最佳方法是使用更少的:

svn日志--无冗余

一旦less出现输出,您可以点击
/
进行搜索,就像VIM一样

编辑:

根据作者的说法,他想搜索的不仅仅是信息和文件名。在这种情况下,你将被要求用类似于以下的东西一起进行犹太区黑客攻击:

svn diff -r0:HEAD | less

您也可以用
grep
或其他方法来搜索您。如果您想在存储库的子目录上使用它,您将需要使用
svn log
来识别该目录存在的第一个版本,并使用该版本而不是
0
,我通常会照着说的做(使用svn log--verbose)但是我用管道连接grep而不是less。

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


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

我使用的是一个小的shell脚本,但它只适用于单个文件。当然,您可以将它和find结合起来,以包含更多的文件

#!/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进行搜索

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


我遇到了这个问题

svnadmin dump <repo location> |grep -i <search term>
svnadmin dump | grep-i
为我做了这项工作。返回了第一次出现的版本,并引用了我要查找的行。

git svn clone
git svn clone <svn url>
git日志-G

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

但是,它要求搜索项当前位于文件系统文件中。对于与文件系统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 }'

我遇到了这个问题,但我没有尝试过。

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

svn log——搜索
搜索作者、日期、日志消息文本和更改路径列表

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

svn log -v --diff [repository] > somefile.log
然后使用vim或nano或任何你喜欢的工具,搜索你想要的东西。你会很快发现的


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

svn log-l | grep-C如果您试图确定哪个版本负责特定代码行,您可能正在寻找:

svn blame

信用证:

这不是全文搜索,而是搜索日志和文件名。这是我通常会做的事情,但我发现使用
更少的
你实际上可以看到修订、日期等,而不仅仅是评论中的行。这通常是我一直在寻找的。这不是全文搜索,而是搜索日志和文件名。如果是这样,那么你需要使用更具表现力的提交日志。如果你想消除不同版本之间的差异,那完全是另一回事。我个人不知道如何做到这一点。>svndiff-r0:HEAD>log>less log是我在windows上的选择。谢谢,我已经用OpenGrok好几个月了,它很不错。Fisheye很不错。正如你所说,不是免费的,但目前,5个用户是10美元,但只有10个用户它跳到1000美元!我不得不用:awk'{print substr($1,2,length($1))}从修订号中删除“r”,并删除grep“-q”选项,以实际显示匹配项。strings myDump.txt | grep“turtle fwd 10”这就是为什么我们采用git的原因。我们可能希望对ignore case执行最后一个grep-i,并删除-q以实际查看匹配的行。Subversion 1.8接受
--search
参数,用于
svn log
命令。请参见我在
svn log--search上的回答,该搜索不按照@rjmunro的要求执行全文搜索,但只搜索作者、日期、日志消息和更改路径列表。仅在本地工作,如果存储库很大,则需要大量时间。方便,但不进行全文搜索。我坚持git svn的答案:-)目前谷歌代码上的svn回购还没有在svn 1.6上运行。。。见:?但是,将客户端更新为1,8(以及任何签出的repo的svn升级)将允许您使用svn log--搜索repo…工作副本需要所有更新,但此命令列出
svn log -v --diff [repository] > somefile.log
svn blame