[Git]masterと作業ブランチの差分ファイルを抽出してzip化する
こんにちは、むったん(@6ttan)です。
前職では本番環境、仮想環境、作業環境にそれぞれGitをインストールしており、反映作業はGitを通して行うというラクな環境でした。
※逆に「ミスがある場合もコマンド一発反映できる」という恐怖もありました
今お世話になっている会社さんでは、作業ファイル自体はGitで管理、共有していますが、本番反映は手作業で行っています。
なので作業した納品データは差分データのみまとめて送ります。
つまり、作業したファイルが多いほど手作業+目視チェックは大変で、ミスもしやすい。
今回は、脱アナログ作業!ということで、Gitで管理しているmasterブランチと作業ブランチの差分ファイルを抽出し、zipファイルにまとめるコマンドをご紹介します。
Contents close
コマンドについて
使用状況の想定
今回使用するコマンドはこんな状況を想定しています。
- 作業前のデータ(本番に反映されてる最新データ)がリモートmasterブランチにある
- 作業用に作業ブランチを作成し、コミットしている
- リモートmasterと作業ブランチ間の差分ファイルが欲しい
仮に作業ブランチを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