140

すべての履歴を含め、Subversion リポジトリの全文検索を実行する方法はありますか?

たとえば、どこかで使用した機能を書きましたが、その後は必要なくなったので、ファイルを svn rm しましたが、別の目的で使用するためにもう一度見つける必要があります。svn のログには、おそらく「未使用のものを削除しました」などと書かれており、そのようなチェックインがたくさんあります。

編集 2016-04-15:ここで「全文検索」という用語が求めているのは、ファイル名やコミット メッセージではなく、コミット履歴の実際の差分を検索することであることに注意してください。私がこれを指摘しているのは、上記の著者の言い回しがそれをうまく反映していないためです。彼の例では、ファイル名やコミット メッセージだけを探している可能性があるからです。したがって、多くのsvn log回答とコメント。

4

16 に答える 16

76
git svn clone <svn url>
git log -G<some regex>
于 2010-09-29T10:24:53.823 に答える
24

Windows を実行している場合は、SvnQueryをご覧ください。ローカルまたはリモート リポジトリの全文インデックスを維持します。これまでにリポジトリにコミットされたすべてのドキュメントがインデックス化されます。シンプルな Web インターフェイスから Google のようなクエリを実行できます。

于 2009-01-27T23:03:23.387 に答える
21

小さなシェルスクリプトを使用していますが、これは単一のファイルに対してのみ機能します。もちろん、これを 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 します。

于 2010-01-07T09:20:58.807 に答える
12

これを行うために私が見つけた最良の方法は、以下を使用することです。

svn ログ --詳細 | 以下

less が出力されたら/、VIM のようにヒットして検索できます。

編集:

著者によると、検索対象はメッセージやファイル名だけではありません。その場合、次のようなものと一緒にゲットーハックする必要があります。

svn diff -r0:HEAD | less

代わりにgrep、または他の何かを検索することもできます。これをリポジトリのサブディレクトリで使用する場合は、 を使用svn logして、そのディレクトリが存在する最初のリビジョンを識別し、 の代わりにそのリビジョンを使用する必要があり0ます。

于 2008-09-04T17:22:35.593 に答える
9

私は似たようなものを探してきました。私が思いついた最高のものはOpenGrokです。私はまだそれを実装しようとはしていませんが、有望に思えます。

于 2008-09-04T17:06:56.380 に答える
6

無料ではありませんが、JIRA を提供している Atlassian の Fisheye を検討してみてください。他の多くの便利な機能を使用して、SVN に対して全文検索を行います。

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

于 2010-04-26T15:42:13.050 に答える
5

私はちょうどこの問題に遭遇し、

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

私のために仕事をしました。最初に見つかったリビジョンを返し、探していた行を引用しました。

于 2010-06-24T14:31:17.463 に答える
4

私は同じものを探していて、これを見つけました:

http://svn-search.sourceforge.net/

于 2008-10-26T15:07:01.507 に答える
2

私はそれを使った経験はありませんが、SupoSE (Java で書かれたオープン ソース) はまさにこれを行うために設計されたツールです。

于 2008-09-04T17:04:53.280 に答える
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 }'
于 2012-01-07T00:05:21.413 に答える
1

私は通常、Jack Mの言うこと (svn log --verbose を使用) を実行しますが、less ではなくgrepにパイプします。

于 2008-09-04T17:25:45.367 に答える
-2

特定のコード行を担当しているリビジョンを特定しようとしている場合は、おそらく次のものを探しています。

svn blame

クレジット:元の回答

于 2016-07-29T14:17:45.140 に答える
-3

このbash scriptに出会いましたが、試したことはありません。

于 2012-06-24T11:34:54.433 に答える