質問
すべての履歴を含む 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
作成者、日付、ログ メッセージ テキスト、および変更されたパスのリストを検索します。
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 に対する全文検索を実行します。
同じものを探していたところ、次のようなものを見つけました。
ちょうどこの問題に遭遇したところですが、
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 少ない代わりに。
これに出会いました bash スクリプト, 試したことはありませんが。