Git リポジトリに 1 つのブランチがある場合、ファイルのすべてのバージョンを取得するにはどうすればよいですか? 最終的に必要な出力は、バージョンごとに 1 つの新しい出力ファイルです (ただし、各バージョンの範囲を簡単に判断できる限り、すべてのバージョンを STDOUT に出力しても問題ありません)。
これが私が現在使用しているものです:
branch=master
filename=...whatever...
myids=( $(git rev-list --objects $branch -- $filename | grep $filename | perl -e 'for (<>) { print substr($_, 0, 40) . "\n"; }') )
for (( i=0,j=1; i < ${#myids[@]}; i++,j++ ))
do
echo $i $j
name="output_$j.txt"
git cat-file -p ${myids[$i]} > $name
done
私がやっていることの説明:
rev-list関連するハッシュを見つけるために使用します- コミットとツリーのハッシュを取り除き、ファイルのハッシュだけを残します (これらの行にはファイル名も含まれます)
- ファイル名を取り除く
- ハッシュを実行して
cat-file出力ファイルを生成する
これに関して私が抱えている 2 つの主な問題は、1)grep誤検出が発生する可能性があるため堅牢ではないこと、およびファイルの名前変更に従うかどうかわからないこと、および 2) 非常にハッキーに感じられることです。
おそらくgitのAPIをより有効に活用して、これを行うためのより良い方法はありますか?