0
0

More than 1 year has passed since last update.

Gitの差分ファイルのみzipにするWindowsバッチファイル

Last updated at Posted at 2023-08-21

内容

「変更ファイルだけ指定した場所に納品して」のように言われた場合に使えるバッチファイルを作成しました。

検索すると、bash用のコマンド(git archiveとgit diffを組み合わせたもの)は見つかるのですが、Windowsのコマンドラインで同じことをするのは難しい為、今回作成したものです。

仕様

ファイルパスはダブルコーテーションで囲うようにしている為、ファイスパスにスペースが含まれていも正しく動作します。

また、差分ファイルの一覧を表示してくれる為、表示結果をコピペしてドキュメントやメールに貼ったりもできます。

バッチファイルをパスの通った場所に置き、以下のように使用します。

git_archive_diff.bat HEAD~1 HEAD archive.zip

上記の例では、HEAD~1とHEADの差分ファイルのみをHEADからgit achiveし、archive.zipという名前でカレントフォルダに保存します。

git_arcive_diff.bat

以下のバッチファイルをパスの通った場所に置きます。

git_archive_diff.bat
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION

REM コマンドライン引数のチェック
IF "%~1"=="" GOTO USAGE
IF "%~2"=="" GOTO USAGE
IF "%~3"=="" GOTO USAGE

REM 引数からの情報を変数にセット
SET START_COMMIT=%~1
SET END_COMMIT=%~2
SET OUTPUT_FILE=%~3

REM git diff で差分のファイル一覧を temp.txt に出力
git diff --name-only %START_COMMIT% %END_COMMIT% --diff-filter=ACMR > temp.txt

REM 差分ファイル一覧を表示
type temp.txt

REM ファイルからパスのリストを作成
SET FILELIST=
FOR /F "delims=" %%i IN (temp.txt) DO (
    SET FILELIST=!FILELIST! "%%i"
)

REM パスのリストを git archive に渡す
git archive %END_COMMIT% --output=%OUTPUT_FILE% %FILELIST%

REM 一時ファイルを削除
del temp.txt

GOTO END

:USAGE
echo Usage: %0 [start commit] [end commit] [output file]
echo Example: %0 HEAD~1 HEAD archive.zip

:END
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0