内容
「変更ファイルだけ指定した場所に納品して」のように言われた場合に使えるバッチファイルを作成しました。
検索すると、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