关于svn:搜索颠覆历史(全文)

关于svn:搜索颠覆历史(全文)

Searching subversion history (full text)

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

例如,我编写了一个我在某个地方使用过的功能,但之后就不需要了,所以我对这些文件进行了调整,但现在我需要再次找到它以将其用于其他内容。 svn日志可能会说"删除未使用的东西"之类的内容,并且有大量的签名。

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


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

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

svn log --search搜索作者,日期,日志消息文本和更改路径列表。

见SVNBook | svn log命令行参考。


如果您正在运行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

如果你真的想要搜索所有内容,请使用svnadmin dump命令并通过grep进行搜索。


我发现这样做的最好方法是:

svn log --verbose | less

一旦产生较少的输出,你可以点击/进行搜索,就像VIM一样。

编辑:

根据作者的说法,他想要搜索的不仅仅是消息和文件名。在这种情况下,您需要与以下内容一起进行密集攻击:

1
svn diff -r0:HEAD | less

您也可以替换grep或其他内容来搜索您。如果要在存储库的子目录中使用它,则需要使用svn log来识别该目录所在的第一个修订版,并使用该修订版而不是0


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


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

对于diff,您可以使用--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编写)是一个旨在实现这一目标的工具。


svn log -l | grep -C<5 or more lines>


我把它写成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脚本,但我还没有尝试过。


推荐阅读

    程序执行linux命令?

    程序执行linux命令?,系统,工作,地址,环境,信息,管理,命令,文件,目录,程序,lin

    linux执行2个命令?

    linux执行2个命令?,工作,系统,基础,命令,基础知识,信息,管理,在线,概念,第一

    linux命令批量执行?

    linux命令批量执行?,系统,代码,工作,周期性,数据,定期,环境,命令,文件,脚本,l

    linux二进制执行命令?

    linux二进制执行命令?,系统,工作,情况,代码,信息,位置,地址,命令,文件,目录,L

    linux执行退出命令?

    linux执行退出命令?,档案,状态,工作,命令,信息,地址,电脑,系统,编辑,文件,lin

    linux中后台执行命令?

    linux中后台执行命令?,系统,状态,暂停,灵活,电脑,网络,服务,第一,名字,命令,l

    linux常用的执行命令?

    linux常用的执行命令?,系统,地址,工作,基础,标准,命令,工具,环境,信息,代码,L

    linux下内存调整命令?

    linux下内存调整命令?,系统,情况,地址,工具,总量,总额,管理,内存,机制,内核,

    linux执行线程命令?

    linux执行线程命令?,系统,工作,线程,软件,服务,管理,信息,环境,名称,命令,lin

    linux搜索过去命令?

    linux搜索过去命令?,系统,信息,命令,名称,工作,预期,数字,地址,标准,服务,Lin

    linux执行多条命令?

    linux执行多条命令?,数据,通信,管理,系统,命令,标准,信息,工具,代码,环境,Lin

    linux命令搜索命令?

    linux命令搜索命令?,系统,位置,地址,标准,管理,信息,命令,名称,工作,文件,Lin

    linux退出命令未执行?

    linux退出命令未执行?,服务,工具,代码,环境,数据,官网,命令,用户,脚本,字符

    linux动态执行命令?

    linux动态执行命令?,时间,信息,名字,工作,网上,业务,工具,对比,地址,下来,如

    linux命令执行次数?

    linux命令执行次数?,时间,系统,地址,命令,数据,管理,工具,信息,环境,历史,lin

    linux命令一起执行?

    linux命令一起执行?,系统,标准,设备,地方,软件,代码,网站,网络,周期性,命令,l

    linux日志搜索命令?

    linux日志搜索命令?,信息,系统,对比,工具,一致,日志,文件,命令,实时,网络,lin

    linux命令字符搜索?

    linux命令字符搜索?,系统,工具,命令,灵活,信息,工作,字符串,文本,文件,模式,l

    查看执行的命令linux?

    查看执行的命令linux?,系统,地址,信息,工作,命令,灵活,网络,名称,情况,状态,

    linux导出执行命令?

    linux导出执行命令?,数据,系统,命令,下来,位置,时间,工具,服务,文件,指令,lin