有没有一种方法来执行全文搜索的版本库,包括所有的历史吗?

例如,我写的一个特征,我使用的地方,但它不是需要的,所以我svn rm会的文件,但现在我需要找到它再次使用它的别的东西。Svn日志可能是说类似"除未使用的东西",并没有载荷的签入这样。

编辑2016-04-15: 请注意,有什么问这里的术语"全文搜索",是为了 搜索的实际差异的承诺的历史,并且没有名称和/或提交信息.我指出这是因为提交人的措辞上述并不反映非常好-因为他例子,他可能也是只有在寻找的文件和/或提交信息。因此很多 svn log 答复和评论。

有帮助吗?

解决方案

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

其他提示

svn log 在阿帕奇颠复1.8支持 一个新的 --search 选项.所以你可以搜索的版本库的历史记录的消息,而无需采用3'rd方的工具和脚本。

svn log --search 搜索作者、日期、日志信息的文字和列表的变化的路径。

看看 SVNBook| svn log 命令行参考.

如果你正在运行的窗户看看 SvnQuery.它维持一个完整的文本指数的当地或远程存储库。每个文档都致力于一个存储库获取的编制索引。你可以做类似谷歌查询,从一个简单的网络接口。

我使用一个小shellscript,但这仅适用于一个单一的文件。你当然可以结合起来找到包括更多的文件。

#!/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 命令和查询通过的。

最好的办法,我发现这样做是与少:

svn日志--详细|小

一旦少来了输出,你可以打 / 搜索,就像VIM。

编辑:

根据提交人,他想要搜索的不仅仅是信息和文件的名称。在这种情况下你将需要的贫民区-哈克一起是这样的:

svn diff -r0:HEAD | less

你还可以替代的 grep 或者别的事情要做,搜寻你。如果你希望使用这一子目录的储存库,将需要使用 svn log 辨别的第一修订版本这一目录存在,并利用这一修正,而不是的 0.

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

svn log -v [repository] > somefile.log

为差异可以使用 --diff 选项

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

然后使用vim或纳米或者任何你喜欢的使用,并做一个搜索为什么你要找的。你会发现它很快。

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

虽然不是免费的,你可能会来看看鱼眼从讨论大多数集中,同样的伙计们,把你的JIRA.它不会全文搜索对SVN与许多其他的有用功能。

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

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

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

我刚刚遇到这个问题,

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

没有适合我的工作。回对修订第一次发生,并援引线我一直在寻找。

我没有任何与它的经验,但是 (开放源码写在Java)是一个工具的设计做的正是这一点。

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

我写的这个为cygwin bash脚本到解决这个问题。

但是它要求的搜索词是目前在文件系统的文件。所有文件,配合文件系统查询,查询所有svn差异的该文件,然后进行的。不完美的,但应当足够好对于大多数使用情况。希望这会有所帮助。

/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日志--详细的)但是我管的 查询 而不是更少。

如果你是在试图确定哪些修订是负责一个具体的行代码,你可能正为:

svn blame

信用: 原来的答案

我遇到了这个 砸向脚本, 但是我没有尝试过。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top