搜索颠覆历史(全文)

Posted

技术标签:

【中文标题】搜索颠覆历史(全文)【英文标题】:Searching subversion history (full text) 【发布时间】:2010-09-07 20:01:45 【问题描述】:

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

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

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

【问题讨论】:

Apache Subversion 1.8 接受 --search 参数作为 svn log 命令。在***.com/a/17473516/761095查看我的回答 svn log --search 不执行@rjmunro 要求的全文搜索,而只搜索作者、日期、日志消息和更改路径列表。 【参考方案1】:

我对此没有任何经验,但 SupoSE(开源,用 Java 编写)是专门为实现此目的而设计的工具。

【讨论】:

【参考方案2】:

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

【讨论】:

我已经使用 OpenGrok 好几个月了,它非常棒。【参考方案3】:

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

svn 日志 --verbose |少

一旦有输出,你可以点击/进行搜索,如VIM。

编辑:

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

svn diff -r0:HEAD | less

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

【讨论】:

这不是全文搜索,而是搜索日志和文件名。 如果是这种情况,那么您需要使用更具表现力的提交日志。如果您想区分修订版之间的差异,那就是另一个蜡球。我个人不知道如何做到这一点。 > svn diff -r0:HEAD > log > less log 是我在 Windows 上的选择。谢谢【参考方案4】:

我通常按照Jack M 所说的去做(使用 svn log --verbose),但我使用管道传送到 grep 而不是 less。

【讨论】:

这不是全文搜索,而是搜索日志和文件名。 这是我通常最终会做的事情,但我发现使用less 您实际上可以看到修订、日期等,而不仅仅是评论中的行。无论如何,这通常是我正在寻找的。​​span> 【参考方案5】:

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

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

【讨论】:

【参考方案6】:

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

【讨论】:

如果 SvnQuery 仍然被维护,那就太好了,但遗憾的是它死了,现在它根本不起作用。 我在github.com/kalyptorisk/svnquery/releases找到了一个工作克隆(?)【参考方案7】:

我正在使用一个小的 shellscript,但这仅适用于单个文件。您当然可以将它与 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 搜索。

【讨论】:

我不得不从修订号中删除“r”: awk 'print substr($1,2,length($1))' 并删除 grep "-q" 选项,实际上显示匹配项。 字符串 myDump.txt | grep "乌龟 fwd 10" 这就是我们拥抱 git 的原因。 可能要执行最后一个 grep -i 忽略大小写并删除 -q 以实际查看匹配的行【参考方案8】:

虽然不是免费的,但您可以看看 Atlassian 的 Fisheye,这些人为您带来了 JIRA。它使用许多其他有用的功能对 SVN 进行全文搜索。

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

【讨论】:

Fisheye 不错。正如你所说,不是免费的,但 目前,5 个用户是 10 美元,但只有 10 个用户,它会跳到 1000 美元!【参考方案9】:

我刚刚遇到了这个问题

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

为我完成了这项工作。返回第一次出现的修订版并引用了我正在寻找的行。

【讨论】:

仅在本地工作,如果存储库很大,将花费大量时间。【参考方案10】:
git svn clone <svn url>
git log -G<some regex>

【讨论】:

请注意,这可能需要一段时间,具体取决于存储库的大小。对我来说花了一个多小时。 我对这个解决方案投了反对票,因为将大型 SVN 存储库转换为 GIT 通常不可行,或者需要很长时间。这就像在对 C# 语言结构有疑问时推荐 Java。 您可能需要为此命令安装额外的软件包。在 Ubuntu 上,你想apt-get install git-svn 不使用“svn log --verbose --diff | grep ...”购买你大致相同的功能而不必使用git? @lyte 功能大致相同。到目前为止,您单独使用 svn 非常好。我觉得利用 git 搜索提交的想法很荒谬。当您想查看的不仅仅是包含您搜索的术语的行时,麻烦就开始了。 grep 可以在查找结果之前和之后打印多行,但您永远不知道需要多少行(在顶部查找修订号或在底部查找整个注释)。输出很难阅读。【参考方案11】:

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

但是,它要求搜索词当前位于文件系统文件中。对于与文件系统 grep 匹配的所有文件,然后执行该文件的所有 svn 差异的 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 '

【讨论】:

'A' 努力! (只需使用 git :))【参考方案12】:

我遇到了这个bash script,但我没有尝试过。

【讨论】:

【参考方案13】:

Apache Subversion 1.8 中的svn log 支持a new --search option。因此,您无需使用第三方工具和脚本即可搜索 Subversion 存储库历史日志消息。

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

见SVNBook | svn log command-line reference。

【讨论】:

方便,但不是全文搜索。我坚持使用 git-svn 答案:-) 不是说目前 googlecode 上的 svn repos 仍在 svn 1.6 上运行...见:code.google.com/p/support/wiki/…?但是,将您的客户端更新到 1,8(以及任何签出的 repo 的 svn 升级)将允许您在 repo 上使用 svn log --search ... 工作副本需要所有更新,但此命令列出了整个更改,包括修订号、更改的文件和注释。怎么不是全文?【参考方案14】:
svn log -v [repository] > somefile.log

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

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

然后使用 vim 或 nano 或任何您喜欢使用的东西,然后搜索您要查找的内容。你会很快找到它。

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

【讨论】:

AFAICS,这将搜索提交消息,而不是实际的差异。 然后使用 svn log -v --diff [repository] ​​> somefile.log 或者只是像 zednight 的回答那样通过 grep 管道【参考方案15】:

svn log -l&lt;commit limit&gt; | grep -C&lt;5 or more lines&gt; &lt;search message&gt;

【讨论】:

添加 --diff 以获取更改的文本搜索【参考方案16】:

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

svn blame

信用:original answer

【讨论】:

以上是关于搜索颠覆历史(全文)的主要内容,如果未能解决你的问题,请参考以下文章

颠覆美国科技界的华裔天才出生 | 历史上的今天

颠覆人才市场?区块链凭什么?

VIE区块链搜索引擎试图颠覆在线搜索行业

ChatGPT 这玩意好吓人,真能颠覆搜索引擎?

如何显示来自颠覆服务器的存储库列表

能源颠覆的进击,特斯拉Model Y性能测试!