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で、あってもなくても意味は一緒ですが、「…」(スリードット)は意味が違ってくるので、注意が必要です。 どういう内容で抽出したいのか、目的に合わせて使い分けになります。 違いについては以下のサイトが図解もありわかりやすいです。
差分をファイルに書き出す
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