搜索颠覆历史(全文)


135

有没有一种方法可以对包括所有历史在内的Subversion存储库执行全文搜索?

例如,我写了一个我在某处使用过的功能,但后来并不需要它,所以我对文件进行了编码,但是现在我需要再次查找它以将其用于其他用途。svn日志中可能会显示诸如“删除未使用的东西”之类的内容,并且有大量此类签入操作。

编辑2016-04-15:请注意,术语“全文本搜索”在这里要求的是搜索提交历史记录的实际差异,而不是文件名和/或提交消息。我指出这一点是因为作者的上面措辞不能很好地反映这一点-因为在他的示例中,他可能还只是在寻找文件名和/或提交消息。因此,很多svn log答案和评论。


6
Apache Subversion 1.8接受命令--search参数svn log。请在stackoverflow.com/a/17473516/761095上
bahrep 2013年

3
svn log --search不会按照@rjmunro的要求执行全文搜索,而仅搜索作者,日期,日志消息和更改路径列表。
zb226 '16

Answers:


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

1
好点子。gitk GUI很好地执行了这种搜索,并且使用git svn工具访问svn存储库很容易。诚然,自从我问这个问题以来,我已经完全转向使用git了,因此接受这个答案可能对我来说有些特定。
rjmunro

4
请注意,这可能需要一段时间,具体取决于存储库的大小。对我来说,花了一个多小时。
user247702

20
我不赞成这种解决方案,因为将大型SVN存储库转换为GIT通常是不可行的,或者会花费太多时间。就像对C#语言构造有疑问时推荐Java。
ooxi

3
您可能需要为此命令安装其他软件包。在Ubuntu上,您想要apt-get install git-svn
尼斯

5
难道“ svn log --verbose --diff | grep ...”无需使用git就可以购买大致相同的功能吗?
lyte

41

svn log在Apache Subversion 1.8中支持--search选项。因此,您可以搜索Subversion存储库历史记录日志消息,而无需使用第三方工具和脚本。

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

参见SVNBook | svn log命令行参考


7
方便,但不是全文搜索。我坚持使用git-svn答案:-)
rjmunro

4
并不是目前googlecode上的svn回购协议仍在svn 1.6上运行...请参阅:code.google.com/p/support/wiki/…?但是,将您的客户端更新为1,8(以及任何已检出的回购协议的svn升级)将使您可以使用svn log-搜索该回购协议...
Mario

工作副本需要所有更新,但是此命令列出了整个更改,包括修订号,更改的文件和注释。它不是全文吗?
BernhardDöbler'17


21

我正在使用一个小的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”选项,以实际显示匹配项。
雨果2010年

字符串myDump.txt | grep“ turtle fwd 10”
jedierikb 2012年

2
这就是为什么我们拥抱git。
有限赎罪2013年

可能想做最后一个grep -i以忽略大小写,并放下-q才能实际看到匹配的行
Belun '16

13

我发现做到这一点的最佳方法是减少花费:

svn log --verbose | 减

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

编辑:

根据作者的说法,他想搜索的不仅仅是消息和文件名。在这种情况下,您将被要求使用ghetto hack程序,例如:

svn diff -r0:HEAD | less

您也可以替代grep或进行其他搜索。如果要在存储库的子目录上使用它,则需要使用svn log来辨别该目录所在的第一个修订版本,并使用该修订版本代替0


5
这不是全文搜索,而是搜索日志和文件名。
rjmunro

如果真是这样,那么您需要使用更具表现力的提交日志。如果要复制不同修订版本之间的差异,那就是其他蜡球。我个人不知道这样做的方法。
杰克M.09年

> svn diff -r0:HEAD> log>在Windows上我选择较少的日志。谢谢
kingoleg '16


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

对于差异,您可以使用该--diff选项

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

然后使用vim或nano或任何您喜欢使用的东西,并搜索所需的内容。您会很快找到它。

这不是花哨的脚本或任何自动化的工具。但这有效。


AFAICS,它将搜索提交消息,而不是实际的差异。
rjmunro

然后使用svn log -v --diff [repository]> somefile.log
JREN

6

虽然不是免费的,但您可以看看Atlassian的Fisheye,这些人为您带来JIRA。它使用许多其他有用的功能针对SVN进行了全文搜索。

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


1
鱼眼很好。正如您所说,这不是免费的,但是<= 10的提交者许可证每年仅$ 10。
杰森·S

目前,有5位用户的价格为10美元,但只有10位用户的价格跃升至1,000美元!
Mawg说恢复Monica


4

我刚遇到这个问题,

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

为我做了工作。返回第一次出现的修订,并引用了我要查找的行。


1
仅在本地工作,如果存储库很大,将花费大量时间。
bahrep 2013年

2

我没有任何经验,但是SupoSE(用Java编写的开放源代码)是专门用于实现此目的的工具。


2

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


1

我通常按​​照Jack M的说做(使用svn log --verbose),但是我用管道传递给grep而不是更少。


5
这不是全文搜索,而是搜索日志和文件名。
rjmunro

这通常是我通常要做的,但是我发现less实际上您可以看到修订,日期等,而不仅仅是注释中的行。无论如何,通常这就是我要找的东西。
杰克M.09年

1

我将其编写为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 / svn修订版

#!/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 :))
有限赎罪

-1

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

svn blame

信用:原始答案


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.