この記事についてClaude(Anthropic)との共同編集により作成されました。
要約
- 非Gitワークスペースでは CLAUDE.md のバージョン管理が効かないのが課題
- dotfiles リポジトリに CLAUDE.md の実体を置き、
ln -sで各ワークスペースに配置する方法で解決した- グローバル(
~/.claude/CLAUDE.md)・ブログ用・Kaggle用の3つをdotfilesで管理している.claude/rules/はワークスペースのローカルに直置き。CLAUDE.md だけを dotfiles に寄せるのがポイント
CLAUDE.md の管理パターンについては前回の記事で整理した。今回はその中の「パターンB: ナレッジベース管理者」に該当する自分の環境で、実際にどう管理しているかの実践ログ。
課題: 非GitワークスペースのCLAUDE.mdはバージョン管理が効かない
自分の作業環境には、Git管理していないワークスペースが2つある。
~/blog_workspace/ ← ブログ執筆用(非Git)│ ├── yurudeep/ ← Astro製ブログのGitリポジトリ│ └── gdrive/ ← Google Driveへのシンボリックリンク│~/kaggle_workspace/ ← Kaggle実験管理用(非Git) └── gdrive/ ← Google Drive上の実験ディレクトリblog_workspace/ はブログのGitリポジトリ yurudeep/ とGoogle Driveのネタ帳を束ねるワークスペースで、kaggle_workspace/ はKaggleコンペの実験管理をGoogle Drive上でやるためのワークスペースだ。
どちらもワークスペース自体はGit管理していない。中にGitリポジトリが入っていたり、Google Driveへのリンクがあったりするだけで、ワークスペースのルートに .git はない。
つまり、ワークスペースルートに置いた CLAUDE.md に対して git log で変更履歴を追うことができない。「さっきの修正で何を消したっけ」が確認できない。マシンが壊れたらCLAUDE.mdも消える。
解決策: dotfilesリポジトリ + シンボリックリンク
考え方は単純で、CLAUDE.md の実体を dotfiles リポジトリに置き、各ワークスペースにはシンボリックリンクを張る。
dotfilesリポジトリの構成
~/dotfiles/ ← Gitリポジトリ├── claude/│ └── CLAUDE.md ← グローバル設定の実体├── blog_workspace/│ └── CLAUDE.md ← ブログ用の実体└── kaggle_workspace/ └── CLAUDE.md ← Kaggle用の実体シンボリックリンクの配置
ln -s ~/dotfiles/claude/CLAUDE.md ~/.claude/CLAUDE.mdln -s ~/dotfiles/blog_workspace/CLAUDE.md ~/blog_workspace/CLAUDE.mdln -s ~/dotfiles/kaggle_workspace/CLAUDE.md ~/kaggle_workspace/CLAUDE.mdこれで実体は ~/dotfiles/ にあり、Git で変更履歴を追える。各ワークスペースからはシンボリックリンク経由で普通に読み込まれる。Claude Code はシンボリックリンクを透過的に扱うので、リンク先がdotfilesにあることを意識する必要はない。
確認してみると、ちゃんとリンクになっている。
$ ls -la ~/blog_workspace/CLAUDE.mdlrwxr-xr-x 1 user staff 44 4 13 13:17 CLAUDE.md -> /Users/user/dotfiles/blog_workspace/CLAUDE.md
$ ls -la ~/.claude/CLAUDE.mdlrwxr-xr-x 1 user staff 36 4 6 23:09 CLAUDE.md -> /Users/user/dotfiles/claude/CLAUDE.md3つのCLAUDE.mdの役割分担
グローバル(~/.claude/CLAUDE.md)
全プロジェクト共通の設定。中身はほぼ空で、将来的に「日本語で返答」のような全体指示を入れる想定。
# Global Claude Instructions現時点ではほぼ何も書いていない。グローバル設定は下手に書くと特定プロジェクトで邪魔になるリスクがあるので、本当に全プロジェクトで必要なものだけに絞る方針。
ブログ用(~/blog_workspace/CLAUDE.md)
約140行。ブログ執筆に必要な情報を詰め込んでいる。
# Blog Workspace — Claude Instructions
## 概要このワークスペースは「ゆるディープ」ブログの更新作業用ディレクトリ。
## リポジトリ構成yurudeep/├── src/content/posts/ # 記事ファイル├── public/blogimg/ # 記事用画像...
## 記事のフォーマット(frontmatterのテンプレート)
## カテゴリ一覧(7カテゴリの説明)
## Google Driveネタ管理(gdrive/ の使い方)
## 注意事項(dist/ は触らない、等)ワークスペース直下に yurudeep/(Astroブログ)と gdrive/(Google Drive)があるという構成の説明、記事のフォーマット、カテゴリ一覧、ネタ管理のルールなどが入っている。Claude Code でこのワークスペースを開いたとき、「何がどこにあるか」「記事をどう書くか」が即座にわかるようにしてある。
Kaggle用(~/kaggle_workspace/CLAUDE.md)
約200行。Kaggle コンペの実験管理に特化した内容。
# kaggle_workspace: AI実験プロジェクト構成
## ディレクトリ構成gdrive/kaggle_experiments/└── {competition-name}/ ├── research/ # コンペ調査資料 ├── EXP/ # 実験ディレクトリ │ ├── EXP_SUMMARY.md # 実験履歴の一元管理 │ └── EXP000/ # 各実験 └── data/
## 実験管理システム(EXP + child-exp)(大きな実験 vs 小さな実験の判断基準)
## EXP_SUMMARY.md の運用ルール(LBスコア報告時の更新手順)
## 開発ワークフロー(ローカル / Colab / Kaggle Notebooks の使い分け)ブログ用とは全く性格が異なる。実験ディレクトリの命名規則、EXP_SUMMARY.md の更新ルール、「Claude Code はローカルで学習スクリプトを実行しない」といった制約など、Kaggle固有の指示が並んでいる。
なぜ .claude/rules/ はdotfilesに入れないのか
CLAUDE.md はdotfilesで管理しているが、.claude/rules/ 配下のルールファイルはワークスペースのローカルに直置きしている。
~/blog_workspace/├── CLAUDE.md ← dotfilesへのシンボリックリンク└── .claude/ ├── rules/ │ └── reference.md ← ローカルに直置き └── settings.local.json ← ローカルに直置き理由は2つ。
1. rules はワークスペース固有度が高い
.claude/rules/reference.md はブログの引用スタイルを定義したファイルで、Kaggleワークスペースには関係がない。ワークスペースをまたいで共有する意味がないものはdotfilesに入れても管理が煩雑になるだけだ。
2. settings.local.json は環境依存
.claude/settings.local.json にはパーミッション設定(許可したコマンドのリスト等)が入っている。これはClaude Codeを使っていると自動的に追記されるファイルで、dotfilesでバージョン管理する性質のものではない。
方針: CLAUDE.md だけを dotfiles に寄せ、それ以外はローカルに置く。
CLAUDE.md は「自分で書いて、自分で管理する」ファイルだからdotfilesと相性がいい。一方、.claude/ 配下のその他のファイルは自動生成されたり環境依存だったりするので、dotfilesに入れると差分ノイズが増える。
セットアップ手順
新しいマシンで同じ環境を再現するときの手順。
1. dotfilesリポジトリをclone
cd ~git clone git@github.com:username/dotfiles.git2. シンボリックリンクを張る
# グローバル設定ln -s ~/dotfiles/claude/CLAUDE.md ~/.claude/CLAUDE.md
# ブログ用ワークスペースmkdir -p ~/blog_workspaceln -s ~/dotfiles/blog_workspace/CLAUDE.md ~/blog_workspace/CLAUDE.md
# Kaggle用ワークスペースmkdir -p ~/kaggle_workspaceln -s ~/dotfiles/kaggle_workspace/CLAUDE.md ~/kaggle_workspace/CLAUDE.md3. ワークスペース固有のファイルを作成
.claude/rules/ やその他のローカルファイルは、必要に応じてワークスペースごとに手動で作る。
# ブログ用の引用スタイルルールmkdir -p ~/blog_workspace/.claude/rules# reference.md を手動で作成CLAUDE.mdの更新フロー
日常的な更新はこうなる。
# ブログ用CLAUDE.mdを編集(シンボリックリンク経由で普通に編集)vim ~/blog_workspace/CLAUDE.md
# 変更をdotfilesにコミットcd ~/dotfilesgit add blog_workspace/CLAUDE.mdgit commit -m "Update CLAUDE.md for blog workspace"git pushシンボリックリンク経由で編集しても、実体は ~/dotfiles/ 側にあるので git diff でちゃんと差分が見える。Claude Code の中からCLAUDE.mdを参照している最中でも、リンク先のファイルを直接編集すれば即座に反映される。
メリットとデメリット
メリット
- 変更履歴が残る。 「いつ何を変えたか」が
git logで追える - 新しいマシンで復元できる。 dotfiles を clone して
ln -sするだけ - 複数ワークスペースを一元管理。 dotfiles リポジトリを見れば、全ワークスペースのCLAUDE.mdが一覧できる
- Claude Code の動作に影響しない。 シンボリックリンクは透過的に扱われる
デメリット
- リンク切れのリスク。 dotfiles リポジトリのパスを変えるとリンクが切れる。ただし
ls -laですぐにわかる - 新しいワークスペースを追加するたびに手動でリンクを張る必要がある。 自動化スクリプトを書けば解決するが、ワークスペースが増える頻度は低いので手動で十分
- dotfiles リポジトリの構成がワークスペース名に依存する。 ワークスペースの名前を変えたくなったとき、dotfiles側のディレクトリ名も変える必要がある
実用上、デメリットが問題になったことはない。ワークスペースの追加や名前変更はめったに起きないからだ。
まとめ
非Gitワークスペースが複数ある環境では、CLAUDE.md のバージョン管理が課題になる。dotfiles リポジトリにCLAUDE.mdの実体を集約し、シンボリックリンクで配置するのがシンプルで実用的な解決策だった。
ポイントは CLAUDE.md だけを dotfiles に入れる こと。.claude/rules/ や settings.local.json はワークスペースのローカルに置いた方が管理が楽だ。
Gitリポジトリで開発している人にはこの仕組みは不要だ(CLAUDE.md をリポジトリに直接コミットすればいい)。非Gitワークスペースを使っている人で、CLAUDE.md の管理に困っている人の参考になれば。
参考文献
- Anthropic公式ドキュメント — Memory https://docs.anthropic.com/en/docs/claude-code/memory