2015年9月2日水曜日

git archive と git diff で差分のアーカイブを作成するとき Bad file number

バージョン間の差分を抽出してアーカイブを作成するとき git archive と git diff を組み合わせることでできるのですが、Bad file number というメッセージが表示されアーカイブ作成に失敗してしまいました。
git archive --format=zip [new ver] `git diff --name-only [old ver] [new ver]` -o ./ver_diff.zip
普段はこのコマンドで作成できるが /bin/git: Bad file number が表示され作成できない。
git diff --name-only [old ver] [new ver]
差分だけを確認したところ差分の数が1000を超えていました。
git diff --name-only --diff-filter=ACMRT [old ver] [new ver]
数が多かったのでフィルターをかけたところ、それでも差分の数が1000を超えていました。
試しに差分の数が少ないケースで実行してみたところアーカイブは作成できました。
作成できるケースとできないケースがあったので、一度に git archive で渡せるパスの数には
限度があると思います。

git diff で差分のファイルを抽出して、そのファイルをアーカイブ(zip や tar)が作成できれば
目的は達成できるので別の方法を探してみました。
git diff --name-only --diff-filter=ACMRT [old ver] [new ver] | xargs tar czf ./ver_diff.tar.gz
git diff で差分のファイルパスを抽出し、それを tar に渡すことで差分ファイルのみが含まれた状態のアーカイブを作成することができました。
tar コマンドは Windows では用意できなかったため、今回はCentOS5系で実行しました。
git のコマンドで完結しようと躍起になっていましたが、少し落ち着いて考えてみたらアーカイブを作成する方法は他にも色々ありますよね。