git-diffで差分ファイルのみをarchive.zipにする

やりたいこと

  • クライアント案件で、本番サーバーへのアクセス権がない。
  • 更新作業の際には差分ファイルのみを納品するように要求されている。

git archiveで差分抽出

git archiveコマンドで、前回納品時とのdiffを抽出してzip化する

1
git archive --format=zip HEAD `git diff master --name-only` -o archive.zip

git diffmasterブランチ(前回納品時の状態を想定)との差分ファイルリストを取得して、git archiveに渡してあげる。
これでアーカイブ化できました。

–diff-filterを使う

上記の手法だと差分の中に削除したファイルも含まれてしまい、以下のエラーメッセージが出ます。

1
fatal: pathspec 'path/to/not/exist/file' did not match any files

削除したファイルはgit archive対象のリストに渡らないようにすれば良さそうです。
公式ドキュメントのgit-diffのページを見ると、--diff-filterというオプションがありました。

Select only files that are Added (A), Copied (C), Deleted (D), Modified (M), Renamed (R)

このオプションを使って追加したファイル(A)と編集したファイル(M)だけにフィルタリングされたリストが作れそうです。

1
git archive --format=zip HEAD `git diff master --name-only --diff-filter=AM` -o archive.zip

これでOK。
困ったときは公式ドキュメントに限りますね。