MacBook ProとMacBook Airを使い分けています。気分と場所と要求性能よって持ち出すマシンが変わります。
となるとわりと同じリポジトリを両方のマシンに置いています。peco と ghq を使って ~/dev/src/{domain}/{org}/{repo} という構造で揃えているので、パスも同じです。
問題は「どちらのマシンで改修したか分からなくなる」ことです。
push し忘れたままもう片方で作業を始めてしまう。気づいたときには origin から乖離していて、整理に時間がかかる。そういうことが何度かありました。
iCloud Drive に入れようとして、やめた
最初に思いついたのは iCloud Drive に ~/dev/src を入れることでした。
やめました。
.git ディレクトリの同期中に別マシンがアクセスするとオブジェクト DB が壊れることがあるとききました。node_modules や gem の大量ファイルが iCloud の同期キューに詰まります。ビルド成果物のバイナリは競合しても iCloud には解決できません。
デメリットが多すぎて、メリットの「楽に同期できる」という一点では釣り合いませんでした。
git のまま管理して、乖離を「気づける」ようにする
発想を変えました。同期の手段を iCloud Drive に求めるのではなく、git をそのまま使い続けながら、乖離に気づける仕組みを作ることにしました。
Claude Code の skill内で、以下の手順を定義しています。
for repo in $(find ~/dev/src -name ".git" -type d -maxdepth 4 2>/dev/null | sed 's|/.git||'); do
echo "=== $(basename $repo) ==="
cd "$repo"
git fetch --quiet 2>&1
git status -sb 2>&1 | head -3
if [ -f ".gitmodules" ]; then
git submodule update --init --recursive --quiet 2>&1
fi
echo ""
done
maxdepth 4 は ~/dev/src/{domain}/{org}/{repo}/.git という4階層を前提にした数字です。それより深くは掘りません。
[ahead N] や [behind N] が出たリポジトリだけ手動で対処します。自動 push も自動 pull もしません。判断はわたしがします。
「忘れたら教えてもらう」仕組み
skill を定義しても、実行するのを忘れれば意味がありません。
~/.zshrc に以下を書きました。
_git_sync_check_reminder() {
local last_run=$(stat -f "%m" ~/dev/src 2>/dev/null)
local now=$(date +%s)
local diff=$(( now - last_run ))
if [ $diff -gt 86400 ]; then
echo "[git-repo-sync-check] 最終実行から$(( diff / 3600 ))時間経過。Claude Codeで git-repo-sync-check skill を実行してください。"
touch ~/dev/src
fi
}
_git_sync_check_reminder
~/dev/src ディレクトリの mtime を「最終実行タイムスタンプ」として流用しています。skill 実行後に touch ~/dev/src するだけです。別途タイムスタンプ管理用のファイルを置くより、ディレクトリそのものを使う方が自然でした。
1日以上経過していたら端末起動時にメッセージが出ます。リマインダーが発火した時点で touch するので、その日は一度だけ表示されます。
GNU stow で両 Mac に同期
この .zshrc の変更と Claude Code の skill ファイルは GNU stow で管理しています。dotfiles リポジトリが両マシンで共有されているので、片方で変更するともう片方にも反映されます。
今回の仕組みを整えたあと、もう片方の Mac でターミナルを開いたらすぐリマインダーが出ました。そのまま skill を実行して、乖離しているリポジトリを push して、あっさり終わりました。peco と ghq でパスを揃えておいたことが、こういうところで効いてきます。