【Git】SourceTreeで差分ファイルのみzip圧縮(改修版)
「sourcetree 差分抽出」などのワードで検索してみると、やり方はたくさん出てきます。
ところが、検索上位にある記事のそのほとんどが、部分的に間違いが存在している状況です。
私はこの間違いに気づかず、エラーが頻発して困っていました。
そのエラーは、コミット間で削除したファイルが存在する場合に出ます。
本記事は、エラーを解消した差分ファイル抽出【訂正版】のエントリーとなります。
バッチファイルを作成
「export_diff_zip.bat」というファイル名のバッチファイルをテキストツールなどで作成します。
if "%2" EQU "" (
set PARAM1=HEAD
set PARAM2=%1
) else (
set PARAM1=%1
set PARAM2=%2
)
setlocal enabledelayedexpansion
set RET_DIR=
for /F "usebackq" %%i in (`git diff --name-only %PARAM1% %PARAM2%`) do (
set RET_DIR=!RET_DIR! "%%i"
)
git archive --format=zip --prefix=archive/ %PARAM1% %RET_DIR% -o archive.zip
多くの記事では上記コードを紹介していますが、実は git diff --name-only %PARAM1% %PARAM2%
の部分が間違いです。
git diff コマンドでコミット間の差分を抽出する場合、git diff 変更前コミット 変更後コミット
という記述ルールがあるので、%PARAM1% と %PARAM2% を入れ替えて、git diff --name-only %PARAM2% %PARAM1%
とするのが正しい記述となります。
正しいバッチファイルの中身
if "%2" EQU "" (
set PARAM1=HEAD
set PARAM2=%1
) else (
set PARAM1=%1
set PARAM2=%2
)
setlocal enabledelayedexpansion
set RET_DIR=
for /F "usebackq" %%i in (`git diff --name-only --diff-filter=ACMR %PARAM2% %PARAM1%`) do (
set RET_DIR=!RET_DIR! "%%i"
)
set time=%time: =0%
set TODAY=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%
git archive --format=zip --prefix=archive/ %PARAM1% %RET_DIR% -o archive_%TODAY%.zip
修正をしているだけでなく、少し改良を加えています。
--diff-filter=ACMR
で「追加」「コピー」「修正」「リネーム」したファイルのみ抽出。
zipファイル名に「日付_時間」が入るよう調整。
「archive_20200520_001122.zip」というファイル名で保存されます。
SourceTreeの使い方、カスタム操作の使い方はこちらのサイトをご参考くださいね。