1. HOME
  2. Other
  3. Gitの差分ファイルを日付付きでZIPアーカイブするバッチスクリプトの解説と活用例
Other - 2025-07-17

Gitの差分ファイルを日付付きでZIPアーカイブするバッチスクリプトの解説と活用例

対象:Windows 環境、バージョン管理にGitを使用している開発者向け

はじめに

チーム開発やバージョン管理の現場で、「ある2つのコミット間で変更されたファイルだけを取り出して共有したい」「成果物の差分だけをZIPで保存したい」といったニーズは少なくありません。

この記事では、Gitの差分ファイルを抽出し、それをZIPアーカイブにまとめ、処理日の日付をファイル名に含める実用的なバッチスクリプトをご紹介します。

完成形スクリプト

以下は、git diff によって変更されたファイルだけを git archive でまとめ、出力ファイル名に処理日 (YYYYMMDD) を付加するバッチファイルの全体像です。

diff_zip.bat

@echo off
:: パラメータの処理
if "%2" equ "" (
  set param1=HEAD
  set param2=%1
) else (
  set param1=%1
  set param2=%2
)

:: PowerShellで日付を取得(YYYYMMDD形式)
for /f %%i in ('powershell -Command "Get-Date -Format yyyyMMdd"') do set datestr=%%i

:: 差分ファイルの取得
setlocal enabledelayedexpansion
set diff=
for /f "usebackq" %%i in (`git diff --name-only --diff-filter=ACMR %param2% %param1%`) do (
  set diff=!diff! "%%i"
)

:: zipファイルに日付を追加
git archive --format=zip --prefix=diff_archive/ %param1% %diff% --output=_list-archive_%datestr%.zip

echo 完了: _list-archive_%datestr%.zip が作成されました。

各パートの詳しい解説

1. パラメータ処理

if "%2" equ "" (
  set param1=HEAD
  set param2=%1
)
  • コマンドライン引数が1つだけの場合は、「HEAD とその1つ前のコミット」の差分を取得。
  • 2つ指定された場合は「param2param1」間の差分を取得します。

2. 日付の取得(YYYYMMDD形式)

for /f %%i in ('powershell -Command "Get-Date -Format yyyyMMdd"') do set datestr=%%i
  • Windowsのdateコマンドはロケール依存のため、確実にフォーマットできる PowerShell を使います。
  • 出力例: 20250715

3. 差分ファイルのリストアップ

git diff --name-only --diff-filter=ACMR %param2% %param1%
  • --name-only:変更ファイル名だけを抽出。
  • --diff-filter=ACMR:追加(A)、コピー(C)、修正(M)、リネーム(R)のみ対象とします。

4. ZIPアーカイブの作成

git archive --format=zip --prefix=diff_archive/ %param1% %diff% --output=_list-archive_%datestr%.zip
  • --prefix=diff_archive/:ZIP内のディレクトリ名。全ファイルがこのディレクトリ下に格納されます。
  • %diff%:差分ファイルのパスリスト。
  • %datestr%:日付付きファイル名にすることで履歴管理が容易になります。

使用例

コミット間の差分を取得してZIP保存

diff_zip.bat a04bbf3b7 a788a434f7

生成されるファイル:

_list-archive_20250715.zip

中身は、a04bbf3b7 から a788a434f7 の間で追加・変更・コピー・リネームされたファイルだけが diff_archive/ フォルダに格納されたZIPです。

応用:CI/CDや納品に活用

  • リリースごとの成果物の自動出力
  • 開発中の差分をデザイナーや翻訳者に共有
  • クライアントへ変更内容を明示して納品
:: 例: 最新コミットとの差分をZIPで取得
diff_zip.bat 1.2.0

トラブルシューティング

症状原因と対策
pathspec '202507.zip' did not match any files%diff% 変数が空。コミット間に差分がない、または日付取得に失敗してファイル名が壊れている可能性あり。echo %datestr% で確認。
日付が文字化けするdate /t を使用していた場合のロケール依存。PowerShellを使えば回避可能。

おわりに

このバッチスクリプトは、Git の便利機能を活かしつつ、Windows環境での自動化を実現する実践的なツールです。

「開発と運用の橋渡し」や「履歴付きの成果物アーカイブ」に役立つので、ぜひご自身のプロジェクトに取り入れてみてください。