web-dev-qa-db-ja.com

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

過去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ではない)に変更し、2行目のdir/foo.xmlをリポジトリ内のファイルのパスに変更する必要があります。

日付にアンダースコアを付けることが非常に重要な場合は、4行目を次のように変更します。

    rev_date=$(svnlook date -r $rev $REPOS | awk '{ print $1 }' | tr - _)

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

4
David Z

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

#!/ bin/bash 
 `svn log $ 1のrev | grep ^ r [0-9] |カット-c2- |カット-d '' -f 1`; do 
 svn log -r $ rev 
 svn diff -r $ [$ rev-1]:$ rev $ 1 2>/dev/null || svn cat -r $ rev $ 1 
 done 

実行するのにサーバーアクセスは必要ありません。そのファイルをチェックアウトしたディレクトリで実行し、引数としてファイル名を渡します。差分をstdoutに出力する代わりに、ループ本体を変更して完全なファイルを書き込むことができます。

 do 
 svn cat -r $ rev $ 1> $ 1. $ rev 
 done 
2
Marius Gedminas

この回答のスクリプトの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
1
David Williams

これは、Windowsを使用している場合に役立つ可能性があります。ファイル名は、スクリプトのパラメーターである必要があります。それをあなた自身のものにしてください。

=== Get-SvnFileHistory.ps1

$Filename = "C:\path\to\workingcopy\file\thefile.txt"

& svn log "$Filename" |
    Select-String -pattern '^r(\d+) ' |
    ForEach-Object {
        if ($_ -match '^r(\d+).*') {
            & svn ls -v -r $Matches[1] "$Filename"
        }
    }

PowerShellコンソールプロンプトから、または次を使用してcmd.exeプロンプトから実行します。

powershell -NoLogo -NoProfile -File "C:\path\to\script\Get-SvnFileHistory.ps1
0
lit