Subversion履歴の検索(全文)


135

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

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

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


6
Apache Subversion 1.8はコマンドの--search引数を受け入れますsvn logstackoverflow.com/a/17473516/761095で
bahrep

3
svn log --search@rjmunroが必要とする全文検索は実行せず、作成者、日付、ログメッセージ、および変更されたパスのリストのみを検索します。
zb226

回答:


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

1
いい視点ね。gitk GUIはこの種の検索を非常にうまく行い、git svnツールを使用してsvnリポジトリーにアクセスするのは簡単です。確かに、私はこの質問をしたときから完全にgitを使用するようになりました。そのため、この回答を受け入れることは、私に少し固有のことかもしれません。
rjmunro

4
リポジトリのサイズによっては、しばらく時間がかかる場合があります。私にとっては1時間以上かかりました。
user247702

20
大きなSVNリポジトリをGITに変換することは、多くの場合実行不可能であるか、時間がかかりすぎるため、このソリューションに反対しました。これは、C#言語構成について質問があるときにJavaを推奨するようなものです。
ooxi 2016年

3
このコマンドには、追加のパッケージをインストールする必要がある場合があります。Ubuntuでは、あなたがしたいですapt-get install git-svn
2016年

5
「svn log --verbose --diff | grep ...」は、gitを使用せずにほぼ同じ機能を購入しませんか?
lyte

41

svn logApache Subversion 1.8では、新しい--searchオプションがサポートされています。したがって、サードパーティのツールやスクリプトを使用せずにSubversionリポジトリの履歴ログメッセージを検索できます。

svn log --search 作成者、日付、ログメッセージテキスト、変更されたパスのリストを検索します。

SVNBookをsvn log参照してくださいコマンドラインリファレンス


7
便利ですが、全文検索はできません。私はgit-svnの答えにこだわっています:-)
rjmunro 2013

4
現時点では、googlecodeのsvn reposがまだsvn 1.6で実行されています...参照:code.google.com/p/support/wiki/…?ただし、クライアントを1,8に更新(およびチェックアウトしたリポジトリのsvnアップグレード)すると、svn log --searchを使用してリポジトリを検索できるようになります
Mario Ruggier

作業コピーにはすべての更新が必要ですが、このコマンドはリビジョン番号、変更されたファイル、コメントを含む変更全体を一覧表示します。全文ではないのはなぜですか?
BernhardDöbler2017

24

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


SvnQueryがまだ維持されていれば素晴らしいのですが、悲しいことに、SvnQueryは停止し、現在はまったく機能していません。
Dan Atkinson


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を実行します。


リビジョン番号から「r」をawk '{print substr($ 1,2、length($ 1))}'で削除し、grep "-q"オプションを削除して、実際に一致を表示する必要がありました。
Hugo

文字列myDump.txt | grep "カメfwd 10"
jedierikb '14 / 07/14

2
そして、これがgitを採用する理由です。
限定的な贖罪

大文字と小文字を区別しないように最後のgrep -iを実行し、-qを削除して、一致した行を実際に表示することができます
Belun

13

私がこれを行うことがわかった最良の方法は、以下のものです:

svn log --verbose | もっと少なく

出力が少なくなると/、VIMのようにヒットして検索できます。

編集:

著者によると、彼はメッセージとファイル名だけではなく、もっと検索したいと考えています。その場合、次のようなものと一緒にゲットハックする必要があります:

svn diff -r0:HEAD | less

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


5
これは全文検索ではなく、ログとファイル名を検索します。
rjmunro 2008

その場合は、より表現力のあるコミットログを使用する必要があります。リビジョン間の違いをgrepしたい場合、それは他のすべてのワックスのボールです。そして私は個人的にそれを行う方法を知りません。
ジャックM.

> svn diff -r0:HEAD> log> Windowsでは、少ないログを選択します。ありがとう
kingoleg

9

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


私はOpenGrokを数か月間使用してきました。
Mauricio Scheffer

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

差分の場合は、--diffオプションを使用できます

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

次に、vimやnano、または好きなものを使用して、探しているものを検索します。すぐに見つかります。

派手なスクリプトや自動化されたものではありません。しかし、それは機能します。


AFAICS、実際の差分ではなく、コミットメッセージを検索します。
rjmunro 2015年

次にsvn log -v --diff [repository]> somefile.logを使用します
JREN

6

無料ではありませんが、アトラシアンのフィッシュアイを見てみてください。JIRAをもたらしたのと同じ人々です。それは他の多くの便利な機能でSVNに対して全文検索を行います。

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


1
魚眼レンズはかなり良いです。ご存知のように、無料ではありませんが、コミッターライセンス<= 10は年間わずか10ドルです。
Jason S

現在、5ユーザーは$ 10ですが、わずか10ユーザーで$ 1,000にジャンプします。
Mawgはモニカを2016


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 2008

それは私が通常やっているlessことですが、コメントの行だけではなく、実際にリビジョンや日付などを実際に見ることができることがわかりました。それはとにかく私が探しているものです。
ジャックM.

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 }'

努力の 'A'!(gitを使用するだけです:))
限定的な償い

-1

特定のコード行の原因となっているリビジョンを特定しようとしている場合は、おそらく以下を探しています。

svn blame

クレジット:元の回答


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.