Searching subversion history (full text)
Is there a way to perform a full text search of a subversion repository, including all the history?
For example, I've written a feature that I used somewhere, but then it wasn't needed, so I svn rm'd the files, but now I need to find it again to use it for something else. The svn log probably says something like "removed unused stuff", and there's loads of checkins like that.
Edit 2016-04-15: Please note that what is asked here by the term "full text search", is to search the actual diffs of the commit history, and not filenames and/or commit messages. I'm pointing this out because the author's phrasing above does not reflect that very well - since in his example he might as well be only looking for a filename and/or commit message. Hence a lot of the svn log
answers and comments.
git svn clone <svn url>
git log -G<some regex>
svn log
in Apache Subversion 1.8 supports a new --search
option. So you can search Subversion repository history log messages without using 3'rd party tools and scripts.
svn log --search
searches in author, date, log message text and list of changed paths.
See SVNBook | svn log
command-line reference.
If you are running Windows have a look at SvnQuery. It maintains a full text index of local or remote repositories. Every document ever committed to a repository gets indexed. You can do google-like queries from a simple web interface.
I'm using a small shellscript, but this only works for a single file. You can ofcourse combine this with find to include more files.
#!/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
If you really want to search everything, use the svnadmin dump
command and grep through that.
The best way that I've found to do this is with less:
svn log --verbose | less
Once less comes up with output, you can hit /
to search, like VIM.
Edit:
According to the author, he wants to search more than just the messages and the file names. In which case you will be required to ghetto-hack it together with something like:
svn diff -r0:HEAD | less
You can also substitute grep
or something else to do the searching for you. If you want to use this on a sub-directory of the repository, you will need to use svn log
to discern the first revision in which that directory existed, and use that revision instead of 0
.