搜索颠覆历史(全文)
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<commit limit> | grep -C<5 or more lines> <search message>
【讨论】:
添加 --diff 以获取更改的文本搜索【参考方案16】:如果您试图确定哪个版本负责特定的代码行,您可能正在寻找:
svn blame
信用:original answer
【讨论】:
以上是关于搜索颠覆历史(全文)的主要内容,如果未能解决你的问题,请参考以下文章