Git-SSH 複数計算機同期・運用マニュアル

GitHubを使わず、Laptop A/A' と Desktop B を核とした効率的な研究・開発環境の構築

1. システム全体図(ポンチ絵)

手元のLaptop A/A'を「メインリモコン」、大学のDesktop Bを「正本ハブ」とし、各スパコンへ個別に、あるいは一斉にデプロイする構成です。

【 データの流れと接続関係 】 [ Laptop A (手元) ] <-------(A/A'間の同期)---- [ Laptop A' (手元) ] | | +--------------------+---------------------+ | (1) Bを「正本ハブ」として A/A' を同期 v +-----------------------------------------------------------+ | [ Desktop B (Hub/Master) ] | | (大学:正本リポジトリ。ここからも C, D, E へ Push 可能) | +-----------------------------------------------------------+ | | | | (2) AまたはBから、必要なマシンへ個別または一斉Push | v v v [ Desktop C ] [ SuperComp D ] [ SuperComp E ] (大学サブ) (研究所1) (研究所2) ※ 全環境:ベアリポジトリを廃止し、通常リポジトリ+updateInsteadで運用

2. 基本戦略と「なぜベアなしなのか?」

なぜベアリポジトリを使わないのか?

魔法のコマンド: git config receive.denyCurrentBranch updateInstead
これを作業ディレクトリで打つだけで、通常のリポジトリがPushを受け入れ、かつ中身を自動更新するようになります。

3. 各計算機(B, C, D, E)の初期設定

全てのマシンで、作業用ディレクトリを作成し、外部からのPushを許可します。

# 計算機 B, C, D, E のそれぞれで実行
mkdir -p ~/project_dir && cd ~/project_dir
git init
git config receive.denyCurrentBranch updateInstead

4. 司令塔 Laptop A / A' の設定

① 古い設定の削除(掃除)

混乱を避けるため、既存のローカルベア設定などを一度削除します。

git remote remove origin
git remote remove all # 存在する場合のみ

② 新しいリモートの登録

Bを「正本(origin)」とし、各マシン(b, c, d, e)を個別に登録。さらに一括送信用の「all」も作成します。

# Bをメイン同期先として登録
git remote add origin univ-b:~/project_dir

# 個別送信用リモート
git remote add b univ-b:~/project_dir
git remote add c univ-c:~/project_dir
git remote add d inst-d:~/project_dir
git remote add e inst-e:~/project_dir

# 一括送信用リモート (git push all 一発で全員へ)
git remote add all univ-b:~/project_dir
git remote set-url --add --push all univ-b:~/project_dir
git remote set-url --add --push all univ-c:~/project_dir
git remote set-url --add --push all inst-d:~/project_dir
git remote set-url --add --push all inst-e:~/project_dir
確認コマンド: git remote -v で全てのURLが正しく設定されているか確認してください。

5. Desktop B(ハブ)の司令塔化設定

大学にいる時は、Bからも直接他の計算機を制御できるようにします。

# Desktop B のリポジトリにて実行
git remote add c univ-c:~/project_dir
git remote add d inst-d:~/project_dir
git remote add e inst-e:~/project_dir

※ Laptop Aへの逆方向SSHは不要なため、登録しません。

6. 高機能同期スクリプト (gpush)

特定の宛先オプションをつけてPushするためのスクリプトです。A, B 両方に配置推奨。

#!/bin/bash
# Usage: gpush [-b] [-c] [-d] [-e] [-a]

usage() { echo "Usage: gpush [-b] [-c] [-d] [-e] [-a (all)]"; exit 1; }
if [ $# -eq 0 ]; then usage; fi

targets=()
while getopts "bcdea" opt; do
    case "$opt" in
        b) targets+=("b") ;;
        c) targets+=("c") ;;
        d) targets+=("d") ;;
        e) targets+=("e") ;;
        a) targets=("b" "c" "d" "e") ;;
    esac
done

current_branch=$(git symbolic-ref --short HEAD)

for target in "${targets[@]}"; do
    # 自身がDesktop Bの場合、bへのpushはスキップ
    if [[ "$target" == "b" && "$HOSTNAME" == "DesktopB_Host" ]]; then continue; fi
    echo ">> Pushing to: $target ($current_branch)"
    git push "$target" "$current_branch"
done

7. 運用のルールと「逆流」の回収

状況 アクション
Aで書いたコードを保存 git push origin main (Bへ)
特定のスパコンDに送る gpush -d
AとA'を同期させる AでPushした後、A'で git pull origin main
Dでの修正を回収する A(またはB)にて git pull d maingit push origin main
回収のポイント: DやEからはBが見えないため、必ず「動けるやつ(AまたはB)」が「動けないやつ(DまたはE)」からPullで吸い上げ、正本へPushして戻します。