Edited at

Git diff で差分ファイルを抽出する。大量・大容量ファイルでも大丈夫バージョン


やりたいことは差分ファイルの抽出

今回の夢は、指定コミットから指定コミットまでの差分を、ディレクトリ構造そのままで、差分のみzipに圧縮したい願望を叶えることです。


既存記事での差分抽出方法おさらい

色々調べた上で見つかった便利抽出コマンドのおさらいです。

色々なコマンドが見つかりまして、使わせて頂いてました。

git archive revision `git diff --name-only origin/master revision --diff-filter=ACMR` -o diff.zip

diffでファイルリストを出力して、アーカイブでzip可するコマンドですが、

大量のファイルに対応できません

比較的大きなプロジェクトで差分を出していると、すぐにハマります。

なので、これは使わなくなりまして……。

git diff --name-only --diff-filter=ACMR {OLDID} {NEWID} | xargs git archive --format=zip {NEWID}  -o diff.zip

xargsの力で、たくさんファイルがあっても大丈夫! というコマンドですが、

超大量のファイルもしくは、大容量ファイルに対応できません

ここ、きちんと出力できていない事実だけで問題でしたので、原因をそんなに詳しく調べてないのですが、


  • Git Lfsを使っている

  • 1000ファイル以上の大量のファイル

  • mp4等の大容量ファイルを含んでいる

この条件で実行した場合、HEADから数コミット分の差分ファイルしか出力されず、期待したzipを作成できませんでした。

これ以上の差分作成コマンドはネットの海に見当たりません……。

僕は自作を余儀なくされたのでした。


大量、大容量ファイルでも大丈夫バージョンができたー!

git archiveの挙動がエラーも出ず度々変わってくるので、かなり悩まされました。

git diff はどんなにファイルが多くてもすべての差分ファイルリストを出力してくれているようです。

そこで僕は気づきました。


別に git archive使う必要ないんじゃね????

挙動が変なら使わなければいいんですよ。

rm -f diff.zip && git diff --name-only --diff-filter=ACMR {OLD} {NEW} | zip diff.zip -@

これでいいじゃん!!!!

gitに archiveなんて機能があると使いたくなっちゃいますが、 git diffで差分リストさえ出せればどうとでもできるんですよねー。

windowsの人は gitBashとかにでもzipコマンドをインストールしておきましょう。

ただし、チェックアウトしているファイルがzip圧縮されます。HEAD以外の差分抽出は、該当コミットにチェックアウトしてから実行しましょう。

より簡潔にかつスマートなコマンドが出来上がって僕は満足なのでした。

おわり。