GitHubを使わず、Laptop A/A' と Desktop B を核とした効率的な研究・開発環境の構築
手元のLaptop A/A'を「メインリモコン」、大学のDesktop Bを「正本ハブ」とし、各スパコンへ個別に、あるいは一斉にデプロイする構成です。
updateInstead 設定により、Pushした瞬間に作業ディレクトリのファイルが最新に書き換わり、そのまま計算実行が可能。git config receive.denyCurrentBranch updateInstead全てのマシンで、作業用ディレクトリを作成し、外部からのPushを許可します。
# 計算機 B, C, D, E のそれぞれで実行
mkdir -p ~/project_dir && cd ~/project_dir
git init
git config receive.denyCurrentBranch updateInstead
混乱を避けるため、既存のローカルベア設定などを一度削除します。
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が正しく設定されているか確認してください。
大学にいる時は、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は不要なため、登録しません。
特定の宛先オプションをつけて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
| 状況 | アクション |
|---|---|
| Aで書いたコードを保存 | git push origin main (Bへ) |
| 特定のスパコンDに送る | gpush -d |
| AとA'を同期させる | AでPushした後、A'で git pull origin main |
| Dでの修正を回収する | A(またはB)にて git pull d main → git push origin main |
一人で開発していても「ブランチ」を使う最大の理由は、他人との衝突回避ではなく、「安定した計算環境(main)」と「実験的な試行錯誤(dev)」を分離することにあります。
paper-v1 ブランチとして残せば、1年後の査読対応時でも「図表を作成した当時のコード」を1秒で復元できます。git checkout main でいつでも「動く状態」に戻れる安心感が手に入ります。作成した 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 を最新版に更新
git tag v1.0-submissiongit push origin v1.0-submission「一人開発でブランチを作るのは面倒」という感覚は正しいです。 2026年の効率的な研究スタイルとして、以下の「30分ルール」を推奨します。
| 状況 | 推奨アクション | 理由 |
|---|---|---|
| 10分で終わる小さな修正 | 直接 main | 管理コストの方が高くつくため。 |
| 数時間〜数日かかる新機能実装 | ブランチ作成 | 途中で「急ぎのバグ修正」が入った際に、作業を中断して main に戻れるようにするため。 |
| 計算アルゴリズムの抜本的変更 | ブランチ作成 | 「やっぱり前の方が良かった」となった時に、一瞬で元に戻せる「保険」になるため。 |
git checkout -b try-ideagit checkout main で戻り、そのブランチを消すだけ。成功したら merge すればOKです。