tohokuaikiのチラシの裏

技術的ネタとか。

Gitの差分ファイルを削除リスト込みで取得する(WindowsのSourceTree)

既に9年前のエントリーになってしまっていたこれ… tohokuaiki.hateblo.jp

SourceTreeからカスタムアクションで使いたいなと思い、WindowsのBatファイル化できないかと思った。あ、PowerShellの場合は.ps1だっけ? SourceTreeでコミット間の差分ファイル一覧をテキストファイルに出力する方法 - Qiita

スクリプトの作成

ところが、SourceTreeには自前でbashが使えるので結局Shellファイルにした。 リポジトリのルートから

/usr/bin/bash get_gitdiff.sh <from-commit-id> <to-commit-id>

という感じで実行するイメージ。

get_gitdiff.shをこんな感じで作る。

ARCHIVE_INFO_FILE=archive_info.txt
DELETE_FILES_INFO=deleted_files.txt
T_TIME=`date "+%Y%m%d_%H%M%S"`
T_DAY=`date "+%Y%m%d"`

# $1に新しい方、$2に古い方のハッシュ
if [ $# -ne 2 ]; then
    echo "引数が不正です。コミットは2つ指定してください。" >&2
    exit 1
fi

if [ $1 = "-1" ]; then
    echo "未コミットを指定しないでください。" >&2
    exit 1
fi

# コミット情報の表示
echo "指定したコミット情報" > $ARCHIVE_INFO_FILE
echo "From: [古いコミット]" >> $ARCHIVE_INFO_FILE
git log --format="%cd - %cn<%ce> %s" -n 1 $2 >> $ARCHIVE_INFO_FILE
echo "Until: [新しいコミット]" >> $ARCHIVE_INFO_FILE
git log --format="%cd - %cn<%ce> %s" -n 1 $1 >> $ARCHIVE_INFO_FILE

# 削除したファイルの提示
echo "[削除したファイル]" > $DELETE_FILES_INFO
git diff --diff-filter=D --name-only $2 $1 >> $DELETE_FILES_INFO

# 差分抽出
git archive --prefix=$T_DAY/ $1 `git diff --diff-filter=d --name-only $2 $1` -o archive_$T_TIME.tar
tar -rf archive_$T_TIME.tar $DELETE_FILES_INFO $ARCHIVE_INFO_FILE
gzip archive_$T_TIME.tar
rm $DELETE_FILES_INFO $ARCHIVE_INFO_FILE
exit 0

後で見た時に、どのコミット間の情報かというのをarchive_info.txtに残し、削除したファイルはdeleted_files.txtにまとめて手動で削除してもらう。

これをリポジトリルートにおいておく。

SourceTreeのカスタムアクションに追加

ツール>オプション>カスタム操作
と選択して、「追加」する。

実行するスクリプトは、インストールしたSourceTreeの配下にあるbash
私は自分のユーザーディレクトリに入れたので、C:\Users\xxxx\AppData\Local\Atlassian\SourceTree\git_local\bin\bash.exe だった。

パラメータはこんな感じ

$REPO/get_gitdiff.sh $SHA

f:id:tohokuaiki:20191007130333p:plain

実行

Historyで2つのコミットを選択して右クリックからカスタムアクションで実行。

参考記事