Git + rsync で dist ディレクトリを自動同期&差分コミットするスクリプトの構築例

複数の Git リポジトリで構成されたプロジェクトにおいて、「ビルド済みファイル(dist ディレクトリ)」を他のリポジトリと同期しつつ、差分がある場合のみ自動的にコミット・プッシュするフローを構築しました。

この記事では、Bash スクリプトによって rsyncGit を連携させた実装例をご紹介します。


背景と要件

  • 開発用リポジトリ(例:frontend-a)と配信用リポジトリ(例:html-a)を分離
  • frontend-a 側の dist/html-a 側に反映させたい
  • 差分がある場合のみ、html-a 側で commit + push したい
  • Git の develop ブランチ運用を前提とする

ディレクトリ構成(ダミー)

/work/projects/frontend-a/
                          └─ dist/        ← ビルド成果物
/work/projects/html/html-a/
                          └─ .git/        ← 配信用Git管理下

使用技術

  • Bash
  • rsync
  • Git(複数リポジトリ)
  • 差分検出 → 自動 commit/push

スクリプト全体

#!/bin/bash

# 対象プロジェクト一覧
projects=("frontend-a" "frontend-b" "frontend-c")

BASE_DIR="/work/projects"

for project in "${projects[@]}"; do
  SRC="$BASE_DIR/$project"
  DEST="$BASE_DIR/html/html-${project#frontend-}"

  echo "=========="
  echo "[${project}] developブランチをチェックアウト & distを同期"

  if [ ! -d "$SRC" ]; then
    echo "$SRC が存在しません。スキップします。"
    continue
  fi

  # 元リポジトリ develop に切り替え
  cd "$SRC" || continue
  git fetch origin
  if git show-ref --verify --quiet refs/heads/develop; then
    git checkout develop
  else
    git checkout -b develop origin/develop 2>/dev/null || git checkout -b develop
  fi
  git pull origin develop

  # 同期先を develop に checkout(事前に切替)
  mkdir -p "$DEST"
  cd "$DEST" || continue
  if ! git show-ref --verify --quiet refs/heads/develop; then
    echo "[${project}] develop ブランチを作成して push"
    git checkout -b develop
    git push -u origin develop
  else
    git checkout develop
    git pull origin develop
  fi

  # rsync による dist 同期(.git等は除外)
  if [ -d "$SRC/dist" ]; then
    rsync -av --delete \
      --exclude='.git' \
      --exclude='.gitignore' \
      --exclude='.gitattributes' \
      "$SRC/dist/" "$DEST/"
    echo "dist 同期完了: $SRC -> $DEST"
  else
    echo "dist ディレクトリが見つかりません"
    continue
  fi

  # 差分があれば commit & push
  if [ -n "$(git status --porcelain)" ]; then
    TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S")
    echo "差分あり → commit & push 実行"
    git add .
    git commit -m "update: 差分反映 $TIMESTAMP"
    git push origin develop
  else
    echo "差分なし → commit 不要"
  fi
done

実行方法

chmod +x sync_dist.sh
./sync_dist.sh

工夫した点

ポイント内容
ブランチの存在確認develop ブランチがなければ自動作成+push -u
不要ファイルの削除を含む同期rsync --delete により完全ミラーリング
.git ディレクトリの保護--exclude='.git' による削除防止
差分検出に git status --porcelain人間に読みやすく、スクリプトでも判定しやすい形式を活用

まとめ

このスクリプトを活用することで、

  • 成果物の反映作業を自動化
  • 不要な push を防止
  • 複数プロジェクトの一括処理

といった運用の効率化が可能になります。Git と rsync を連携させることで、柔軟かつ安全な自動反映フローを構築できます。

ご自身の開発環境やディレクトリ構成に合わせて、projectsBASE_DIR を調整してお使いください。継続的なビルド・反映プロセスにも応用できます。

コメント

タイトルとURLをコピーしました