题
有没有一种方法来执行全文搜索的版本库,包括所有的历史吗?
例如,我写的一个特征,我使用的地方,但它不是需要的,所以我svn rm会的文件,但现在我需要找到它再次使用它的别的东西。Svn日志可能是说类似"除未使用的东西",并没有载荷的签入这样。
编辑2016-04-15: 请注意,有什么问这里的术语"全文搜索",是为了 搜索的实际差异的承诺的历史,并且没有名称和/或提交信息.我指出这是因为提交人的措辞上述并不反映非常好-因为他例子,他可能也是只有在寻找的文件和/或提交信息。因此很多 svn log
答复和评论。
解决方案
git svn clone <svn url>
git log -G<some regex>
其他提示
svn log
在阿帕奇颠复1.8支持 一个新的 --search
选项.所以你可以搜索的版本库的历史记录的消息,而无需采用3'rd方的工具和脚本。
svn log --search
搜索作者、日期、日志信息的文字和列表的变化的路径。
如果你正在运行的窗户看看 SvnQuery.它维持一个完整的文本指数的当地或远程存储库。每个文档都致力于一个存储库获取的编制索引。你可以做类似谷歌查询,从一个简单的网络接口。
我使用一个小shellscript,但这仅适用于一个单一的文件。你当然可以结合起来找到包括更多的文件。
#!/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
命令和查询通过的。
最好的办法,我发现这样做是与少:
svn日志--详细|小
一旦少来了输出,你可以打 /
搜索,就像VIM。
编辑:
根据提交人,他想要搜索的不仅仅是信息和文件的名称。在这种情况下你将需要的贫民区-哈克一起是这样的:
svn diff -r0:HEAD | less
你还可以替代的 grep
或者别的事情要做,搜寻你。如果你希望使用这一子目录的储存库,将需要使用 svn log
辨别的第一修订版本这一目录存在,并利用这一修正,而不是的 0
.
我一直在寻找类似的东西。好的,我来了 OpenGrok.我没有试图实现它,但是听起来很有希望。
svn log -v [repository] > somefile.log
为差异可以使用 --diff
选项
svn log -v --diff [repository] > somefile.log
然后使用vim或纳米或者任何你喜欢的使用,并做一个搜索为什么你要找的。你会发现它很快。
这不是一个奇特的脚本或任何自动的。但它的工作。
虽然不是免费的,你可能会来看看鱼眼从讨论大多数集中,同样的伙计们,把你的JIRA.它不会全文搜索对SVN与许多其他的有用功能。
我是在寻找同样的东西,并发现了这个:
我刚刚遇到这个问题,
svnadmin dump <repo location> |grep -i <search term>
没有适合我的工作。回对修订第一次发生,并援引线我一直在寻找。
我没有任何与它的经验,但是 想 (开放源码写在Java)是一个工具的设计做的正是这一点。
svn log -l<commit limit> | grep -C<5 or more lines> <search message>
我写的这个为cygwin bash脚本到解决这个问题。
但是它要求的搜索词是目前在文件系统的文件。所有文件,配合文件系统查询,查询所有svn差异的该文件,然后进行的。不完美的,但应当足够好对于大多数使用情况。希望这会有所帮助。
/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 }'
我通常做什么 杰米 说(使用svn日志--详细的)但是我管的 查询 而不是更少。
我遇到了这个 砸向脚本, 但是我没有尝试过。