先日、あるソースファイルを作業していたのですが、コンパイルに必要なファイルが不足している、おまけにすでにその作成者とは連絡がつかなくなっている、という事態に陥りました。ファイルを調べてみるとファイルの実体に関しては消去されていたものの、隠し属性となっていた.svnディレクトリがそのまま残されていることが判明し、それをリカバーすることで対応することができました。
以下は備忘録も兼ねたその手段に関してです。
SVNは元のファイルはハッシュ化されてpristineディレクトリに含まれています。ただ、問題はこのディレクトリは全てハッシュ化されているため、そのままコピーすることができません。そこで、wc.dbから対応表を得ることにしました。
sqlite3 .svn/wc.db "select * from work_queue
対応表はファイル名やファイルハッシュが関連付けられているのでこれをパースすることにより、実体にコピーしていきます。
#!/bin/sh
for line in cat list.txt
; do
echo Processing $line
filedest=$(echo $line | awk -F"|" '{print $1}')
filehash=$(echo $line | awk -F"|" '{print $3}')
if [ ! -d ../../$(dirname $filedest) ]; then
echo Making missing ../../$(dirname $filedest)
mkdir -p ../../$(dirname $filedest)
fi
shash=$(echo $filehash | awk -F"$" '{print $3}')
cp -R $(echo $shash | cut -c1-2)"/"$shash.svn-base ../../$filedest
done
これで全ファイルを取り出すことに成功。もっとエレガントな方法もあるかもしれませんが。