自戒、点検、内省

終わらない反省会をしよう

複数Macで開発してるとどの機材でどう改修したか分からなくなる問題へのクイック対処

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 リポジトリが両マシンで共有されているので、片方で変更するともう片方にも反映されます。

retrospective.hatenadiary.com

今回の仕組みを整えたあと、もう片方の Mac でターミナルを開いたらすぐリマインダーが出ました。そのまま skill を実行して、乖離しているリポジトリを push して、あっさり終わりました。peco と ghq でパスを揃えておいたことが、こういうところで効いてきます。