SVNファイルのすべてのリビジョンを取得する


6

過去3年間に実行したプロジェクトから、中規模のリポジトリ(約2500バージョン)を所有しています。そこに特定のファイル(foo.xmlと呼びましょう)があり、その進化を分析したいと思います。理想的には、私が探しているのは、ファイルに日付が追加されたすべてのバージョンをディレクトリにエクスポートすることです

2007_08_08_foo.xml
2007_08_09_foo.xml
2007_08_15_foo.xml
...

これを達成する最も速い方法は何ですか?


これはあなたの質問に対する直接的な答えではありませんが、「svn annotate filename」を使用することをお勧めします。それは進化を研究する良い方法です。
vtest

回答:


4

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 - _)

また、特定の日にファイルが複数回変更された場合、実際には各日の最初の編集のみが書き込まれたファイルに反映されることに注意してください。


2

私の同僚は、同様の目的でこのシェルスクリプトを作成しました。

#!/ 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

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