複数の Git リポジトリで構成されたプロジェクトにおいて、「ビルド済みファイル(dist ディレクトリ)」を他のリポジトリと同期しつつ、差分がある場合のみ自動的にコミット・プッシュするフローを構築しました。
この記事では、Bash スクリプトによって rsync
と Git
を連携させた実装例をご紹介します。
背景と要件
- 開発用リポジトリ(例:
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
を連携させることで、柔軟かつ安全な自動反映フローを構築できます。
ご自身の開発環境やディレクトリ構成に合わせて、projects
や BASE_DIR
を調整してお使いください。継続的なビルド・反映プロセスにも応用できます。
コメント