1. トップ
  2. web制作
  3. [Git]差分抽出してzipアーカイブを作成-コマンド編-
  • web制作

[Git]差分抽出してzipアーカイブを作成-コマンド編-

web制作をしていると、データ納品や共有などで更新差分ファイルだけを抽出してアーカイブしたいといったケースがあります。

そういう場合に、手動で行うとしたら・・・ ソートして更新日付を見ながら、手動でファイル操作して・・・これって入れといたほうがいいっけ?入れ忘れてた!などなど、ミスにも繋がりやすいため念入りなチェックが必要になりなかなか骨が折れます。

自動で抽出してくれたらいいのに・・・
Git管理をしていればGitで自動抽出できます。Gitに頼っていきましょう!

差分ファイルを抽出してアーカイブを作成するコマンド

masterが本番ブランチ、stagingが作業ブランチとします。
作業差分を抽出し、プロジェクトルートにarchive.zipとしてアーカイブを作成するコマンド例が以下です。

コミットを指定して抽出

git archive --prefix=archive/ master `git diff --name-only 変更前コミット識別子 変更後コミット識別子 --diff-filter=d` -o archive.zip

プッシュ前ならリモートとのブランチ指定で抽出

git archive --prefix=archive/ master `git diff --name-only origin/master master --diff-filter=d` -o archive.zip

masterにstagingマージ前ならローカルブランチ指定でも

git archive --prefix=archive/ staging `git diff --name-only master staging --diff-filter=d` -o archive.zip

指定方法はほかにも色々ありますが、これらをベースに目的に合わせて使用すればOKです。

コマンドの中身を確認

中身を見ていきます。

差分確認(git diff)

コミット間の差分を確認する

git diff 比較元のコミット識別子..比較対象のコミット識別子

ブランチの指定でも

git diff master..staging

コミット識別子はSourceTreeの場合、対象コミットを選択、右クリックから「SHA-1をクリップボードにコピー」でコピーできます。 左が比較元(変更前)、右が比較対象(変更後)です。順番が逆になると、抽出される内容にも影響するので注意が必要です。

間の「..」(ツードット)は省略OKで、あってもなくても意味は一緒ですが、「…」(スリードット)は意味が違ってくるので、注意が必要です。 どういう内容で抽出したいのか、目的に合わせて使い分けになります。 違いについては以下のサイトが図解もありわかりやすいです。

参考:https://stackoverflow.com/questions/7251477/what-are-the-differences-between-double-dot-and-triple-dot-in-git-dif

差分をファイルに書き出す

git diff --name-only 変更前のコミット識別子..変更後のコミット識別子 >> 書き出し先ファイル.txt

–name-onlyはファイル名のみ表示、というオプションです。
触ったファイル一覧を教えて、というようなケースに役立ちそうですね。

アーカイブ(git archive)

ブランチをzipファイルにアーカイブ出力

git archive staging -o staging_archive.zip

では、差分抽出は?さっきのdiffを組み合わせると、可能になります!

git archive --prefix=archive/ staging `git diff --name-only master staging` -o archive.zip

–prefix=archive/ を指定すると、指定したディレクトリ(ここではarchive)の中に格納してくれます。これがないと、解凍したその場で展開され、解凍場所の他ファイルと混ざってよくわからなくなる危険もあります。
データをお渡しした先でどのように解凍されるかわかりません。つけておいたほうが安心です。

ただし、これだと削除ファイルがある場合、ファイルがみつかりません!という以下のメッセージエラーになります。

fatal: pathspec '削除したファイル' did not match any files

削除ファイルはアーカイブに入れられないので、diffの出力をフィルタリングします。

git archive --prefix=archive/ staging `git diff --name-only master staging --diff-filter=ACMR` -o archive.zip

–diff-filter=ACMR を追加しています。

A追加
Cコピー
M変更
Rリネーム
D削除

小文字にすると逆になるので、この場合以下でもOKです。

git archive --prefix=archive/ staging `git diff --name-only master staging --diff-filter=d` -o archive.zip

作ったデータを確認

作成されたzipファイルをダブルクリックで解凍して中身を確認します。
そのままコマンドから確認することもできます。

コマンドから確認

zipinfo archive.zip

いろいろ付属情報がでてきて見づらい場合は、オプションをつけてファイル名だけにすればわかりやすくなります。

zipinfo -1 archive.zip
-1圧縮ファイルに含まれているファイル名一覧のみを表示

まとめ

Gitの機能を使えば、差分ファイルのアーカイブ作成が効率良くミスなくできるようになりますね。
今回はコマンド操作のご紹介でしたが、Sourcetreeを使ってGUIで気軽に操作できるように設定する方法もあります。自分に合った方法で作業円滑化しましょう!

参考:
https://www.granfairs.com/blog/staff/git-archivediff
https://qiita.com/rana_kualu/items/09d2dd379019b8ef0335

クリカフェ[crelab編集チーム]

この記事を書いたのは

クリカフェ[crelab編集チーム]

web制作会社「クリエイターズカフェ」が運営するブログ「crelab(クリラボ)」の運営チームです。クリラボでは、クリカフェのこと、webのこと、不動産のこと、お役立ちツールや情報などなど、いろいろなことをご紹介いたします。
web制作のご依頼やご相談もお気軽にお問い合わせください。