有没有办法对subversion存储库执行全文搜索,包括所有历史记录?
例如,我编写了一个我在某个地方使用过的功能,但之后就不需要了,所以我找了文件,但是现在我需要再次找到它以用于其他东西。 svn日志可能会说“删除未使用过的东西”之类的内容,而且还有大量的签名。
编辑2016-04-15:请注意,这里的术语“全文搜索”是搜索提交历史的实际差异,而不是文件名和/或提交消息。我指出这一点是因为上面的作者的措词并没有很好地反映出来 - 因为在他的例子中他也可能只是寻找文件名和/或提交消息。因此,很多svn log
答案和评论。
答案 0 :(得分:72)
git svn clone <svn url>
git log -G<some regex>
答案 1 :(得分:39)
svn log
支持a new --search
option。因此,您可以在不使用第三方工具和脚本的情况下搜索Subversion存储库历史记录日志消息。
svn log --search
搜索作者,日期,日志消息文本和更改路径列表。
答案 2 :(得分:23)
如果您正在运行Windows,请查看SvnQuery。它维护本地或远程存储库的全文索引。每个提交到存储库的文档都会被编入索引。您可以通过简单的网络界面进行类似Google的查询。
答案 3 :(得分:21)
我正在使用一个小shellcript,但这仅适用于单个文件。您可以将此与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。
答案 4 :(得分:13)
我发现这样做的最好方法是少用:
svn log --verbose |少
一旦输入较少,您可以点击/
进行搜索,例如VIM。
修改强>
根据作者的说法,他想要搜索的不仅仅是消息和文件名。在这种情况下,你将被要求与其他类似的东西进行隔离:
svn diff -r0:HEAD | less
您也可以替换grep
或其他内容来搜索您。如果要在存储库的子目录中使用它,则需要使用svn log
来识别该目录所在的第一个修订版,并使用该修订版而不是0
。
答案 5 :(得分:9)
我一直在寻找类似的东西。我提出的最好的是OpenGrok。我还没有尝试过实现它,但听起来很有希望。
答案 6 :(得分:7)
svn log -v [repository] > somefile.log
对于差异,您可以使用--diff
选项
svn log -v --diff [repository] > somefile.log
然后使用vim或nano或任何你喜欢的东西,并搜索你正在寻找的东西。你会很快找到它。
它不是一个花哨的脚本或任何自动化的东西。但它确实有效。
答案 7 :(得分:6)
虽然不是免费的,但你可以看看Atlassian的Fisheye,那些给你带来JIRA的人。它使用许多其他有用的功能对SVN进行全文搜索。
答案 8 :(得分:4)
我一直在寻找同样的东西并发现了这个:
答案 9 :(得分:4)
我刚遇到这个问题并且
svnadmin dump <repo location> |grep -i <search term>
为我做了这份工作。返回第一次出现的修订版并引用我正在寻找的行。
答案 10 :(得分:2)
我对此没有任何经验,但SupoSE(开源,用Java编写)是一个旨在完成此任务的工具。
答案 11 :(得分:2)
svn log -l<commit limit> | grep -C<5 or more lines> <search message>
答案 12 :(得分:1)
我把它写成cygwin bash脚本来解决这个问题。
但是,它要求搜索词当前位于文件系统文件中。对于与文件系统grep匹配的所有文件,然后执行该文件的所有svn diff的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 }'
答案 13 :(得分:0)
我通常做Jack M所说的内容(使用svn log --verbose)但我输入 grep 而不是更少。
答案 14 :(得分:-1)
答案 15 :(得分:-3)
我偶然发现了bash script,但我还没试过。