過去3年間に実行したプロジェクトから、中規模のリポジトリ(約2500バージョン)を所有しています。そこに特定のファイル(foo.xmlと呼びましょう)があり、その進化を分析したいと思います。理想的には、私が探しているのは、ファイルに日付が追加されたすべてのバージョンをディレクトリにエクスポートすることです
2007_08_08_foo.xml
2007_08_09_foo.xml
2007_08_15_foo.xml
...
これを達成する最も速い方法は何ですか?
過去3年間に実行したプロジェクトから、中規模のリポジトリ(約2500バージョン)を所有しています。そこに特定のファイル(foo.xmlと呼びましょう)があり、その進化を分析したいと思います。理想的には、私が探しているのは、ファイルに日付が追加されたすべてのバージョンをディレクトリにエクスポートすることです
2007_08_08_foo.xml
2007_08_09_foo.xml
2007_08_15_foo.xml
...
これを達成する最も速い方法は何ですか?
回答:
SVNにはその機能が組み込まれているとは思いませんが、SVNリポジトリを保持するサーバーでコマンドを実行できる場合(およびサーバーに利用可能な標準UNIX / Linuxツールがあると仮定すると)、このbashスクリプトはそれを行う必要があります君は:
REPOS=/path/to/repos
FILE=dir/foo.xml
for rev in "$(svnlook history $REPOS $FILE | awk 'NR > 2 { print $1 }')"; do
rev_date=$(svnlook date -r $rev $REPOS | awk '{ print $1 }')
svnlook cat -r $rev $REPOS $FILE > ${rev_date}_${FILE}
done
これにより、フォームのファイル名が生成されます2007-08-08_foo.xml
。もちろん、/path/to/repos
最初の行をリポジトリの実際のファイルシステムパス(URLではない)に変更dir/foo.xml
し、2行目をリポジトリ内のファイルのパスに変更する必要があります。
日付に下線を付けることが本当に重要な場合は、行4を次のように変更します。
rev_date=$(svnlook date -r $rev $REPOS | awk '{ print $1 }' | tr - _)
また、特定の日にファイルが複数回変更された場合、実際には各日の最初の編集のみが書き込まれたファイルに反映されることに注意してください。
私の同僚は、同様の目的でこのシェルスクリプトを作成しました。
#!/ bin / bash `svn log $ 1のrev | grep ^ r [0-9] | カット-c 2- | cut -d '' -f 1`; 行う svn log -r $ rev svn diff -r $ [$ rev-1]:$ rev $ 1 2> / dev / null || svn cat -r $ rev $ 1 やった
実行するためにサーバーにアクセスする必要はありません。そのファイルをチェックアウトしたディレクトリで実行し、引数としてファイル名を渡します。diffをstdoutに出力する代わりに、完全なファイルを書き込むようにループ本体を変更することもできます。
行う svn cat -r $ rev $ 1> $ 1. $ rev やった
この回答のスクリプトの1つで問題が発生していました。ファイル名にスペースが含まれていると、スクリプトが機能しないようです。私はbashスクリプトの達人ではありませんが、これは簡単な解決策です。
#!/bin/bash
echo "svn log \"$1\" | grep ^r[0-9] | cut -c 2- | cut -d ' ' -f 1"
for rev in `svn log "$1" | grep ^r[0-9] | cut -c 2- | cut -d ' ' -f 1`; do
svn log -r $rev
#svn diff -r $[$rev-1]:$rev $1 2>/dev/null || svn cat -r $rev $1
`svn cat -r $rev "$1" > "$rev.$1"`
done