3

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をより有効に活用して、これを行うためのより良い方法はありますか?

4

2 に答える 2