gitの二つのコミットの間で変更されたファイルをまとめるシェルスクリプト

投稿者: | 2025年4月14日

他社の案件に参加することになったのですが、外部からその会社のバージョン管理にアクセスすることができないとのことで、変更したファイルをまとめて送るという方式になりました。
そのためローカルでバージョン管理して、変更のあったファイルをまとめるシェルスクリプトをChatGPTの手を借りて作りました。

#!/bin/bash

# --- 引数チェック ---
if [ -z "$1" ]; then
  echo "使い方: $0 <開始コミットID> [終了コミットID(省略時は HEAD)]"
  exit 1
fi

START_COMMIT=$1
END_COMMIT=${2:-HEAD}  # $2が空ならHEADを使う
DEST_DIR="changed_files"

# 保存先ディレクトリ作成
rm -rf "$DEST_DIR"
mkdir -p "$DEST_DIR"

# --- 変更されたファイル一覧取得 ---
FILES=$(git diff --name-only "$START_COMMIT" "$END_COMMIT")

# --- 各ファイルをコピー ---
for file in $FILES; do
  if [ -f "$file" ]; then
    mkdir -p "$DEST_DIR/$(dirname "$file")"
    cp "$file" "$DEST_DIR/$file"
  fi
done

こちらを archive.sh などと名前をつけて .git のあるディレクトリに置きます。それから下記のように実行します。

archive.sh [開始コミットID] [終了コミットID]

実行が終了すると、changed_filesというディレクトリに変更があったファイルが保存されています。
なお、終了コミットIDが指定されなかった場合は、最新のコミットが自動で指定されます。