質問

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

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

2016-04-15 編集: ここで「全文検索」という用語が求めているのは、 ファイル名やコミットメッセージではなく、コミット履歴の実際の差分を検索します。. 。私がこのことを指摘しているのは、上記の作者の表現がそれをうまく反映していないからです。なぜなら、彼の例では、ファイル名やコミット メッセージだけを探しているのと同じかもしれないからです。したがって、多くの svn log 答えとコメント。

役に立ちましたか?

解決

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

他のヒント

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

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

見る SVNブック | svn log コマンドラインリファレンス.

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

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

私がこれを行うために私が見つけた最良の方法は、少ないもので行うことです。

svn log-verbose |少ない

出力が少なくなったら、次のコマンドを実行します。 / VIM のように検索します。

編集:

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

svn diff -r0:HEAD | less

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

似たようなものを探していました。私が思いついた最高のものは オープングロク. 。まだ実装してみませんが、期待できそうです。

svn log -v [repository] > somefile.log

diffには、を使用できます --diff オプション

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

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

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

無料ではありませんが、JIRA を提供している Atlassian の Fisheye を試してみるとよいでしょう。他にも多くの便利な機能を備えた SVN に対する全文検索を実行します。

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

同じものを探していたところ、次のようなものを見つけました。

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

ちょうどこの問題に遭遇したところですが、

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

私のために仕事をしてくれました。最初に出現したリビジョンを返し、探していた行を引用しました。

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

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

この問題を解決するために、これを 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 }'

私は普段何をしていますか ジャック・M (svn log --verboseを使用)と言っていますが、私はパイプします grep 少ない代わりに。

コードの特定の行にどのリビジョンが影響しているかを判断しようとしている場合は、おそらく次のものを探しているでしょう。

svn blame

クレジット: 元の答え

これに出会いました bash スクリプト, 試したことはありませんが。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top