搜索颠覆历史(全文)

是否有一种方法来执行颠覆存储库的全文搜索,包括所有的历史记录?

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

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

75380 次浏览

我对此没有任何经验,但是 假设(用 Java 编写的开放源码)就是为此而设计的工具。

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

我发现最好的方法就是少用一些:

Svn log ——详细 | 少

一旦有更少的输出,您可以按 /进行搜索,就像 VIM 一样。

编辑:

根据作者的说法,他想要搜索的不仅仅是消息和文件名。在这种情况下,你将被要求在贫民区黑客一起使用这样的东西:

svn diff -r0:HEAD | less

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

我通常执行 Jack M所说的操作(使用 svn log ——详细) ,但是我使用 Grep而不是 less。

我也在找同样的东西,结果发现了这个:

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

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

我使用的是一个小的 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 的鱼眼,也就是为你带来 JIRA 的那些人。它使用许多其他有用的特性对 SVN 进行全文搜索。

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

我遇到了这个问题

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

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

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

为了解决这个问题,我将其作为 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/svnAmendment

#!/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 }'

我偶然发现了这个 Bash 脚本,但是我还没有试过。

更新于2022年4月

VisualSVN Server 5.0附带了一个新的 全文检索全文检索特性,允许您在 Web 界面中搜索存储库的内容和历史记录。试试 演示服务器的功能。


旧答案

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

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

SVNBook | svn log命令行引用

svn log -v [repository] > somefile.log

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

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

然后使用 vim 或者 nano 或者任何你喜欢的东西,然后搜索你想要的。你很快就会找到的。

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

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

如果您试图确定哪个修订负责特定的代码行,那么您可能需要:

svn blame

提供者: 原始答案