• 投稿日 2022.03.01
  • 最終更新日 2023.03.27

広告・PRあり

[Git]masterと作業ブランチの差分ファイルを抽出してzip化する

[Git]masterと作業ブランチの差分ファイルを抽出してzip化する

パンダくん
作業データを納品することになったけど、目視チェック+手作業で差分データを抽出するのって大変すぎる!
むったん
パンダくん!そんなことしなくても、コマンド叩けば差分ファイルを抽出してzipファイルにまとめてくれる方法があるんだよ!

こんにちは、むったん(@6ttan)です。

前職では本番環境、仮想環境、作業環境にそれぞれGitをインストールしており、反映作業はGitを通して行うというラクな環境でした。
※逆に「ミスがある場合もコマンド一発反映できる」という恐怖もありました

今お世話になっている会社さんでは、作業ファイル自体はGitで管理、共有していますが、本番反映は手作業で行っています。
なので作業した納品データは差分データのみまとめて送ります。
つまり、作業したファイルが多いほど手作業+目視チェックは大変で、ミスもしやすい。

今回は、脱アナログ作業!ということで、Gitで管理しているmasterブランチと作業ブランチの差分ファイルを抽出し、zipファイルにまとめるコマンドをご紹介します。

コマンドについて

使用状況の想定

今回使用するコマンドはこんな状況を想定しています。

  • 作業前のデータ(本番に反映されてる最新データ)がリモートmasterブランチにある
  • 作業用に作業ブランチを作成し、コミットしている
  • リモートmasterと作業ブランチ間の差分ファイルが欲しい

仮に作業ブランチをworkブランチとしましょう。

workブランチで作業したファイルが欲しい!

差分確認するブランチがリモートmasterブランチでなくてもOKです。

コマンド内容

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

コマンドの仕組み

上記コマンドは、$ git archive$ git diffを組み合わせています。
それぞれどんな動きをするか見ていきましょう。

ファイルをアーカイブ化する git archive

$ git archiveコマンドは、Git管理下のファイル一式をアーカイブ化します。
今回のコマンドで言えば

$ git archive work -o archive.zip

-oオプションはアーカイブするファイル名を指定しています。
デフォルトの対応形式は.tar.tar.gz.zipとなります。

上記コマンドでworkブランチのファイル一式をarchive.zipにアーカイブ化する、としています。

差分内容を確認する git diff

$ git diffコマンドは、ブランチ間の差分だけでなく、コミットやファイルなど様々な差分を確認するのに使用します。
※つまり、今回のコマンドは$ git diffで取得できるものが対象となります
今回のコマンドで言えば

$ git diff --name-only origin/master work

–name-onlyはファイルのパスを返します。
つまり、リモートmasterブランチとworkブランチの差分をファイル名の一覧で返してくれます。

git archiveとgit diffを組み合わせる

$ git archive work `git diff --name-only origin/master work` -o archive.zip

このようにすると

リモートmasterブランチとworkブランチの差分を取得する

差分のファイル名を返して、archive.zipにアーカイブする

となります。
ただし、$ git diffコマンドには削除したファイルも差分ファイルに含みます。

これがあると$ git diffで「削除した差分ファイルあるよー」となりますが、$ git archiveで「ファイルが削除されてるから見つからないよ!」となり、エラーが出ます。

なので、削除したファイルを含まないようにするために$ git diffのオプション–diff-filter=ACMRを追記しましょう。

A:追加
C:コピー
M:修正
R:リネーム
D:削除

差分ファイルには追加、コピー、修正、リネームしたファイルを返す、という意味になります。

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

アーカイブ後に中身を確認する

アーカイブが完了したら、念のため中身をチェックしましょう。
zip形式のファイルの場合は

zipinfo archive.zip

tar形式のファイルの場合は

tar tvf archive.tar

というコマンドを叩けば、わざわざ解凍してチェックしなくてもファイル一覧を出力することができます。

おわりに

今まで、Githubのコミット一覧にある変更されたファイル一覧を見ながら手作業で差分ファイルを作成していました。

まだ10ファイルとかだったらね、できるけど。
最近100ファイル程作業して、しかもフォルダでかなり細分化されている物を担当したので「あぁ…もう手作業&目視チェックは限界だ」となり、参考ブログにたどり着きました。

コマンドを叩いて、ほんのちょっと待つだけで100ファイルが綺麗にアーカイブ化されて超感動しました!
私と同じように納品ファイルを手作業&目視チェックで作っている方は、ぜひこのコマンドを使ってください。
目が充血しなくて済みます!

参考ブログ:Gitで差分ファイルを抽出+zipファイル化する方法
https://www.granfairs.com/blog/staff/git-archivediff

About Me

むったん
フロントエンドエンジニア | webデザイナー | ブロガー

日々webサイト制作などを行っているフリーランスです。
ブログでは制作の備忘録からゲーム、愛犬トイについて書いています。
お仕事のご依頼はお問い合わせからお願いします。