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] [-m message]

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

targets=()
commit_message=""

# getoptsに "m:" (引数ありのm) を追加
while getopts "bcdeam:" opt; do
    case "$opt" in
        b) targets+=("b") ;;
        c) targets+=("c") ;;
        d) targets+=("d") ;;
        e) targets+=("e") ;;
        a) targets=("b" "c" "d" "e") ;;
        m) commit_message="$OPTARG" ;;
        *) usage ;;
    esac
done

# メッセージが指定されていない場合はタイムスタンプをセット
if [ -z "$commit_message" ]; then
    commit_message=$(date "+%Y-%m-%d %H:%M:%S")
fi

# 1. git add
echo ">> git add ."
git add .

# 2. git commit
# 変更がある場合のみコミットを実行(エラー回避のため)
if ! git diff-index --quiet HEAD --; then
    echo ">> git commit -m \"$commit_message\""
    git commit -m "$commit_message"
else
    echo ">> Nothing to commit, working tree clean."
fi

# 3. git push
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して戻します。

7. 2026年流:一人開発でのブランチ活用術

一人で開発していても「ブランチ」を使う最大の理由は、他人との衝突回避ではなく、「安定した計算環境(main)」と「実験的な試行錯誤(dev)」を分離することにあります。

【 ブランチによる並行世界の管理 】 [ main ] ---------------------------> (論文用の安定版:常に D, E で計算実行中) | | (1) checkout -b sandbox v [ sandbox ] -------+----------+-----> (手元の A で新しい物理モデルを実装) | | (2) gpush -c | (3) 実験成功! main へ merge v | [ Desktop C ] +-----> [ 全環境へ反映 ] (テスト計算)

研究者がブランチを使う3つのメリット

8. ブランチ運用と gpush の連携

作成した gpush スクリプトは、現在チェックアウトしているブランチを自動認識して送信します。

# 1. 新しいアイデアを試すブランチを作成
git checkout -b feat-new-algo

# 2. 手元でコードを書き換える
vim main.py

# 3. テスト機(C)にだけ実験版をデプロイして試す
gpush -c

# 4. うまくいったら main に戻して合流
git checkout main
git merge feat-new-algo
gpush -a  # 全環境の main を最新版に更新
2026年の研究作法:論文投稿時の「凍結」
論文投稿時にはブランチだけでなく「タグ」も活用しましょう。
git tag v1.0-submission
git push origin v1.0-submission
これにより、Desktop B(正本ハブ)に「一生消えない研究の記録」が刻まれます。

9. 実践的判断:いつブランチを作るべきか?

「一人開発でブランチを作るのは面倒」という感覚は正しいです。 2026年の効率的な研究スタイルとして、以下の「30分ルール」を推奨します。

ブランチ作成の判断フロー

状況 推奨アクション 理由
10分で終わる小さな修正 直接 main 管理コストの方が高くつくため。
数時間〜数日かかる新機能実装 ブランチ作成 途中で「急ぎのバグ修正」が入った際に、作業を中断して main に戻れるようにするため。
計算アルゴリズムの抜本的変更 ブランチ作成 「やっぱり前の方が良かった」となった時に、一瞬で元に戻せる「保険」になるため。
研究者のための「とりあえずブランチ」活用法
「ちょっと試したいけど、mainを汚したくないな」と思ったら:
git checkout -b try-idea
この1行で、あなたのメインコードは保護されます。失敗したら git checkout main で戻り、そのブランチを消すだけ。成功したら merge すればOKです。