0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

オレオレ AI Agent向けgit worktreeを紹介(DB, PORT分離)

0
Posted at

概要

普段, Webサービスのバックエンドの開発をしています.
worktreeごとにDBとPORTを作成し、他のagentと競合させない私のlocal開発環境と移行Promptを紹介します

(AIの進化は早く, アンチパターンになっていたらごめんね><)

個人的要件

  • 作業ごとにworktreeを削除してもいいが、高速化やcontext保持のため使い回す(context節約)
  • DBは共通にしたい(メモリがパンパンになる)

docker composeでも、露出するPORTを環境変数で与えたら同じようにできるはず

構成

<project>/
├── .bare/                        # git bare repository(全worktreeの共有本体)
├── main/                         # メインブランチ worktree
├── wt1/                          # 作業用 worktree 1
├── wt2/                          # 作業用 worktree 2
├── wt3/
├── wt4/
├── wt5/
└── <project>.code-workspace      # VS Code workspace

AGENT_WORKTREE_IDで採番, wt1~5としています.
direnv でpath baseでAGENT_WORKTREE_IDを検出しています

# Auto-detect worktree ID from directory path
# Pattern: /wt{N}/ -> AGENT_WORKTREE_ID=N
if [[ "$PWD" =~ /wt([0-9]+)(/|$) ]]; then
  export AGENT_WORKTREE_ID="${BASH_REMATCH[1]}"
  export BACKEND_PORT="${AGENT_WORKTREE_ID}3000"

  export REDIS_URL="redis://localhost:6379/${AGENT_WORKTREE_ID}"
  export BACKEND_DEVELOPMENT_DATABASE_NAME="backend_${AGENT_WORKTREE_ID}_development"
  export BACKEND_TEST_DATABASE_NAME="backend_${AGENT_WORKTREE_ID}_test"

worktreeの場合, PORTに AGENT_WORKTREE_IDのpreffixを追加します
mainが3000のとき, wt1は、13000, wt2は、23000

claude codeがdirenv, miseを読み込めない問題の解決

claude codeはdefault shellとは異なるbash環境を持っており、mise, direnvを読み込めない問題が発生します
(2026年3月に必要な設定で変わったらごめんね><)

❯ cat ~/.claude/settings.json
{
  "env": {
    "CLAUDE_ENV_FILE": "~/.claude/claude-env.sh"
  }
}
❯ cat ~/.claude/claude-env.sh
# Claude Code 専用の環境設定ファイル
# CLAUDE_ENV_FILE に指定され、各 bash コマンドの前に自動で source される

# mise を bash で有効化(ツールのバージョン管理)
if command -v mise &>/dev/null; then
  eval "$(mise activate bash 2>/dev/null)"
fi

# direnv でプロジェクトの .envrc を読み込む
if command -v direnv &>/dev/null; then
  eval "$(direnv export bash 2>/dev/null)"
fi

作成prompt

PORTは環境によってい違うので調整してください!!

# Bare Repository + Worktree 並列開発環境セットアップ

あなたはプロジェクトの並列開発環境をセットアップするエージェントです。
以下の手順に従って、git bare clone + worktree構成を構築してください。

---

## 概要

1つのリポジトリに対して、bare cloneを中心に `main` + `wt1`〜`wt5` のworktreeを作成します。
各worktreeは独立したポート・DB・Redisを持ち、複数のAIエージェントまたは開発者が同時に独立して作業できます。

## ユーザーから受け取る情報

以下をユーザーに確認してください(未指定の場合はデフォルト値を使用):

| パラメータ | 説明 | デフォルト |
|---|---|---|
| `REPO_URL` | クローン対象のリポジトリURL | **必須** |
| `TARGET_DIR` | プロジェクトを配置するディレクトリ | リポジトリ名から自動決定 |
| `WT_COUNT` | worktree数 | `5` |
| サービス一覧 | プロジェクトで使うサービスとそのベースポート | ユーザーのプロジェクト構成に依存 |

---

## Step 1: Bare Clone + Worktree作成

"""bash
# 1. bare clone
mkdir -p <TARGET_DIR>
git clone --bare <REPO_URL> <TARGET_DIR>/.bare

# 2. fetch refspec設定(bare repoでもremote trackingが効くように)
git -C <TARGET_DIR>/.bare config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
git -C <TARGET_DIR>/.bare fetch origin

# 3. デフォルトブランチを確認
git -C <TARGET_DIR>/.bare symbolic-ref --short HEAD

# 4. main worktree作成
git -C <TARGET_DIR>/.bare worktree add <TARGET_DIR>/main <DEFAULT_BRANCH>

# 5. wt1〜wtN 作成(それぞれ一時ブランチで)
for i in $(seq 1 <WT_COUNT>); do
  git -C <TARGET_DIR>/.bare worktree add -b "wt${i}/workspace" <TARGET_DIR>/wt${i} <DEFAULT_BRANCH>
done
"""

## Step 2: .envrc によるポート・DB・Redis分離

各worktreeに `.envrc` を配置します。**ポート分離の規約**:

"""
wt{N} のポート = {N}{ベースポート}
"""

例(ベースポートが3000の場合):
- wt1 → 13000
- wt2 → 23000
- wt3 → 33000

### .envrc テンプレート

各 `wt{N}/.envrc` に以下を配置してください。
**プロジェクト固有のサービスに合わせてカスタマイズが必要です。**

"""bash
# Auto-detect worktree ID from directory path
if [[ "$PWD" =~ /wt([0-9]+)(/|$) ]]; then
  export WORKTREE_ID="${BASH_REMATCH[1]}"

  # ============================================================
  # ポート割り当て
  # 規約: ${WORKTREE_ID}<base_port>
  # ============================================================

  # -- Backend --
  export APP_PORT="${WORKTREE_ID}3000"

  # -- Frontend(s) --
  # export FRONTEND_PORT="${WORKTREE_ID}4000"
  # export ADMIN_PORT="${WORKTREE_ID}4001"
  # export STORYBOOK_PORT="${WORKTREE_ID}6006"

  # -- Infra --
  # export PC_PORT_NUM="${WORKTREE_ID}8080"  # process-compose API

  # ============================================================
  # データベース分離
  # 各worktreeが独立したDBを持つ
  # ============================================================
  export DATABASE_NAME="<project>_${WORKTREE_ID}_development"
  export TEST_DATABASE_NAME="<project>_${WORKTREE_ID}_test"

  # ============================================================
  # Redis分離
  # DB番号でworktreeごとに名前空間を分ける
  # ============================================================
  export REDIS_URL="redis://localhost:6379/${WORKTREE_ID}"

  # ============================================================
  # バックエンドURL(フロントエンドから参照)
  # ============================================================
  # export BACKEND_URL="http://localhost:${APP_PORT}"

  echo "Worktree wt${WORKTREE_ID}: PORT=${APP_PORT} DB=${DATABASE_NAME} REDIS=db${WORKTREE_ID}"
fi
"""

### 重要なポイント

- `.envrc` は `direnv` で自動読み込みされる前提です。各worktreeで `direnv allow` を実行してください。
- ポート番号規約 `${WORKTREE_ID}<base_port>` により、wt1=1xxxx, wt2=2xxxx, ... でポート衝突を完全回避します。
- DBは名前で分離: `<project>_1_development`, `<project>_2_development`, ...
- Redisは論理DB番号で分離: `redis://localhost:6379/1`, `redis://localhost:6379/2`, ...
- S3/R2互換ストレージはバケット名で分離: `<project>-uploads-1`, `<project>-uploads-2`, ...

## Step 3: VS Code Workspace ファイル生成

`<TARGET_DIR>/<project>.code-workspace` を生成:

"""json
{
  "folders": [
    { "name": "main", "path": "./main" },
    { "name": "wt1", "path": "./wt1" },
    { "name": "wt2", "path": "./wt2" },
    { "name": "wt3", "path": "./wt3" },
    { "name": "wt4", "path": "./wt4" },
    { "name": "wt5", "path": "./wt5" }
  ],
  "settings": {
    "files.exclude": {
      "**/.bare": true,
      "**/.git": true
    }
  }
}
"""

## Step 4: DB作成

各worktreeのDBを作成します。プロジェクトのDB種別に応じて実行:

### PostgreSQL の場合
"""bash
for i in $(seq 1 <WT_COUNT>); do
  createdb "<project>_${i}_development" 2>/dev/null || true
  createdb "<project>_${i}_test" 2>/dev/null || true
done
"""

### Rails の場合
"""bash
for i in $(seq 1 <WT_COUNT>); do
  cd <TARGET_DIR>/wt${i}
  direnv allow
  bin/rails db:create db:migrate db:seed
done
"""

### Prisma の場合
"""bash
for i in $(seq 1 <WT_COUNT>); do
  cd <TARGET_DIR>/wt${i}
  direnv allow
  npx prisma db push
  npx prisma db seed
done
"""

## Step 5: 検証

セットアップ完了後、以下を確認:

"""bash
# worktreeが正しく作成されたか
git -C <TARGET_DIR>/.bare worktree list

# .envrcが各worktreeにあるか
ls -la <TARGET_DIR>/wt*/.envrc

# ポートが正しく割り当てられるか(wt1で確認)
cd <TARGET_DIR>/wt1
direnv allow
echo "PORT=$APP_PORT DB=$DATABASE_NAME REDIS=$REDIS_URL"
"""

---

## 最終的なディレクトリ構成

"""
<project>/
├── .bare/                        # git bare repository(全worktreeの共有本体)
├── main/                         # メインブランチ worktree
│   └── .envrc                    # (mainはworktree検出されないのでデフォルト値)
├── wt1/                          # 作業用 worktree 1
│   └── .envrc                    # PORT=1xxxx, DB=*_1_dev, Redis=db1
├── wt2/                          # 作業用 worktree 2
│   └── .envrc                    # PORT=2xxxx, DB=*_2_dev, Redis=db2
├── wt3/
│   └── .envrc
├── wt4/
│   └── .envrc
├── wt5/
│   └── .envrc
└── <project>.code-workspace      # VS Code workspace
"""

## 運用ルール

1. **ブランチ命名**: `agent/{N}/{YYYYMMDD}-{feature}` (例: `agent/3/20260320-add-login`)
2. **mainは直接編集しない**: mainはpull/確認用。作業は必ずwt1〜wt5で行う
3. **worktreeでgit switch mainは不可**: mainは別のworktreeが使用中のため。代わりに `git merge origin/main` や `git rebase origin/main` を使う
4. **direnv allowを忘れずに**: 新しいworktreeや.envrc変更後は必ず実行
5. **DB migrationは各worktreeで個別実行**: DBが分離されているため

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?