🚘

コンテナ内Claude Codeでも怠惰に並列化したい

に公開

ざっくりまとめ

  • git worktree の作業ディレクトリは .git/ 配下に置く
    → ホストとコンテナ間で volume を意識せず変更を残せる
  • Git2.48+ 環境の worktree.useRelativePaths=true でパス問題を解決
    → 環境による絶対パス差分を気にせず worktree が動作
  • 並列実行補助ツール ccmanager を活用
    → “新規タスク = ワンコマンド”のお手軽並列化

Claude Code盆栽してます。
https://github.com/Wisteria30/claude-code-template

コンテナ内でClaude Codeを自走

claude --dangerously-skip-permissionsしてますか?
AIに全てを委ねていい感じに働いて欲しいですよね。
ですが、想定外の影響が出ると困るのでサンドボックス的にコンテナ環境を用意してその中で実行する必要があります。

コンテナ内Claude Codeの並列実行

Claude Codeを並列に利用する場合、公式ではgit worktreeを使った並列化が推奨されています。
また、claudeはタスクの数だけコマンドラインを要求するのでtmuxで複数分割などセッション管理を行うこともセットで要求されます。
https://docs.anthropic.com/en/docs/claude-code/common-workflows#run-parallel-claude-code-sessions-with-git-worktrees

実際の作業は以下のように複数のコマンドを使い分けて行います。

# tmux sessionの起動
tmux
# 新規ブランチを別ディレクトリに切り出す
git worktree add ../project-feature-a -b feature-a
# ブランチ先へ移動。このディレクトリへの移動が実質 git checkout feature-a 
cd ../project-feature-a
# ここでの変更はmainとは独立しているので変更がコンフリクトしない
claude
# 別タスクをやる場合はパネル分割や新規セッションをtmuxで管理する

この作業がClaudeに新しいタスクを依頼するたびに発生するのはとても骨が折れます。
加えて、このやり方は以下2点の理由からコンテナ内開発と相性が悪いです。

  1. worktree先のディレクトリがホストマシンにvolumeマウントされていないと変更が残らない(git remote push以外に同期方法がない)
  2. git worktreeで作られたディレクトリの.gitは元リポジトリに絶対パスでエイリアスを張っているので、コンテナとホストのディレクトリパスが違うと動かない

git worktreeが動かない例

# ホストマシン
$ pwd
> /Users/user-name/github/repo1

# マウント後のコンテナ内
$ pwd
> /workspace/repo1

# worktreeでブランチを切ってエイリアスを確認する
$ git worktree add ../project-feature-a -b feature-a
$ cd ../project-feature-a && cat .git
> gitdir: /workspace/repo1/.git/worktrees/feature-a  # ここで示すディレクトリがgitの実態
# ホストマシンに/workspace/repo1は存在しないので、ホストではgitが反応しない(/Users/user-name/github/repo1.git/worktrees/feature-aが正解)

解消法

git worktreeの作業が煩雑な問題はccmanagerを使って解消しました。
ccmanagerの挙動はREADMEの動画がイメージ湧きやすいのでぜひご覧になってください。
ブランチごとのステータス管理やスムーズなチェックアウト・デタッチの開発体験がとても良いです。
https://github.com/kbwo/ccmanager

また、worktreeの変更を残す方法はccmanagerに設定を追加することで対応しました。
具体的には以下のjsonを ~/.config/ccmanager/config.json に保存することでworktreeを切るディレクトリのデフォルトをそのリポジトリの.git/配下に置くことにしました。
これによってマウントしているディレクトリ内に変更を抑えつつ、gitの変更差分には出さないという状態を作ることができました。

{
  "worktree": {
    "autoDirectory": true,
    "autoDirectoryPattern": ".git/worktree-dir/{branch}"
  }
}

最後に、絶対パスの差分でworktreeで作成したディレクトリの.gitが機能しない問題は以下のgitコマンドで相対パスにすることで解決しました。
ただし、これはGit 2.48+で利用できるオプションなのでホストとコンテナ内のgit versionを最新に更新する必要がありました。(2025/07/01現在、最新は2.50、多くのマシンのデフォルトは2.39)

git config --global worktree.useRelativePaths true

https://git-scm.com/docs/git-config#Documentation/git-config.txt-worktreeuseRelativePaths

これによって快適なClaude Code並列化ライフが過ごせるようになりました。

おわりに

Claude Codeで快適怠惰ライフを過ごすための盆栽をしています。
今回の内容は私のClaude Codeセットアップ環境に含まれています。全ての設定はこちらにあるので、興味があればご覧ください。
https://github.com/Wisteria30/claude-code-template

おまけ

gitの最新版install

# host(mac)
brew install git
export PATH="/opt/homebrew/bin:$PATH"

# contaienr(Dockerfile)
RUN set -eux; \
    echo 'deb http://deb.debian.org/debian sid main' > /etc/apt/sources.list.d/sid.list; \
    printf 'Package: *\nPin: release a=sid\nPin-Priority: 100\n\n' \
        >  /etc/apt/preferences.d/git-from-sid; \
    printf 'Package: git*\nPin: release a=sid\nPin-Priority: 990\n' \
        >> /etc/apt/preferences.d/git-from-sid; \
    apt-get update; \
    apt-get install -y --no-install-recommends git; \
    git --version;

Discussion