1. はじめに
いつもはメインPCのClaude Codeに、自宅サーバーの状態確認や手順書づくりを手伝ってもらっています。ノートPCからも同じ作業をしたくなりましたが、Claude Codeはもう一方のPCで話したことを知りません。ノートPCでやったことをメインPCで説明し、メインPCでやったことをノートPCで説明して……を繰り返すのは面倒です。そこで、Claude Codeのメモリを2台で共有できないか試してみたところ、うまくいったのでまとめます。
Claude Codeが挙げてくれたメモリの共有方法として、NAS経由とGitHub経由がありました。NASはどの家にもあるとは限りませんが、GitHubなら無料で使えて、変更の履歴も残るので、こちらを選びました。
同じことをする記事や専用ツールもあるので、末尾の「参考」に載せています。
2. 環境
| メインPC | ノートPC | |
|---|---|---|
| OS | Windows 11(Proxmox VE上のVM) | Windows 11 |
| プロジェクトの場所 | D:\Project\homelab-consolidation |
C:\Project\homelab-consolidation |
| Claude Code | VS Code拡張 | VS Code拡張(CLI版は未導入) |
| Git | 2.55.0 | 2.55.0 |
- 同期の中継地点: GitHubのPrivateリポジトリ
- リポジトリの中身: 自宅サーバーの手順書(Markdown)と、Claude Codeのメモリ
- Gitのインストール方法はこの記事では省略します(私は
winget install --id Git.Git -e --source wingetで入れました)。インストール後にuser.nameとuser.emailを設定しておきます(設定しないとgit commitでエラーになります) - この記事はWindows同士で試した手順です。Mac・Linuxでは試していません
3. Claude Codeのメモリの仕組み
Claude Codeが新しいセッションで読み込むのは、CLAUDE.mdとメモリだけです。メモリは、Claude Codeが会話の中から「次も覚えておくこと」を選んで書き残したメモです。やり取りをすべて記録した会話の履歴もありますが、こちらは同じPCでも、新しいセッションには読み込まれません。つまり、CLAUDE.mdとメモリさえ揃えれば、どちらのPCでも前の話の続きから相談できます。CLAUDE.mdはプロジェクトの中にあるので、リポジトリに入れればそのまま揃います。一方、メモリはプロジェクトの外にあるので、リポジトリに入れただけでは揃いません。
メモリの場所は、プロジェクトのフルパスで決まる
メモリはPCのユーザーフォルダの下に、プロジェクトのフルパス(ドライブレター込み)から作った名前のフォルダで保存されます。
| 開いたプロジェクト | メモリのフォルダ |
|---|---|
D:\Project\homelab-consolidation |
~\.claude\projects\d--Project-homelab-consolidation\memory |
C:\Project\homelab-consolidation |
~\.claude\projects\c--Project-homelab-consolidation\memory |
私のノートPCにはDドライブがなく、プロジェクトをCドライブに置いたので、メインPCとフォルダ名が揃いません。しかも、メモリの場所を変える設定は見当たりませんでした。
4. 今回の構成: ジャンクション + GitHub
各PCのmemoryフォルダを、ジャンクションでリポジトリの中のclaude-memoryに向けます。あとはリポジトリごとGitHubとpush・pullすれば、2台のメモリが揃います。
ジャンクションとは
ジャンクションは、元の場所に置く「別のフォルダへ通じるドア」です。プログラムからは普通のフォルダに見えるので、Claude Codeは今まで通りmemoryを読み書きし、中身はリポジトリのclaude-memoryに入ります。
- ショートカット(.lnk)はただのファイルなので、この用途には使えません
- ジャンクションは管理者権限なしで作れ、PCの中のドライブをまたぐ(C:→D:)こともできます。NASなどネットワークの場所には張れません
5. 手順(1台目: メインPC)
コマンドはPowerShellです。以下のd--Project-homelab-consolidationとD:\Project\homelab-consolidationは、自分の環境に合わせて読み替えてください。作業の途中でメモリが書き換わると、コピーした中身とずれてしまいます。作業中は、Claude Codeのセッションを閉じておくのがおすすめです。
(1) メモリをバックアップする
# 元のフォルダのファイル数を数えておく
(Get-ChildItem "$env:USERPROFILE\.claude\projects\d--Project-homelab-consolidation\memory" -File).Count
Copy-Item "$env:USERPROFILE\.claude\projects\d--Project-homelab-consolidation\memory" "$env:USERPROFILE\.claude\memory-backup-2026-10-24" -Recurse
# 確認: 最初に数えた数と同じならOK
(Get-ChildItem "$env:USERPROFILE\.claude\memory-backup-2026-10-24" -File).Count
(2) メモリをリポジトリに移して、ジャンクションを張る
ドライブをまたぐフォルダの移動(C:→D:)は、動作としてはコピー+削除です。途中で失敗してもメモリを失わないように、コピー→確認→名前変更の順にして、元のフォルダは消さずに残しました。
# リポジトリの中へコピー
Copy-Item "$env:USERPROFILE\.claude\projects\d--Project-homelab-consolidation\memory" "D:\Project\homelab-consolidation\claude-memory" -Recurse
(Get-ChildItem "D:\Project\homelab-consolidation\claude-memory" -File).Count # (1)で数えた数と同じならOK
# 元のフォルダは名前を変えて残す
Rename-Item "$env:USERPROFILE\.claude\projects\d--Project-homelab-consolidation\memory" "memory.old"
# ジャンクションを作る(管理者権限は不要)
cmd /c mklink /J "$env:USERPROFILE\.claude\projects\d--Project-homelab-consolidation\memory" "D:\Project\homelab-consolidation\claude-memory"
# 確認: LinkTypeがJunction、Targetがclaude-memoryならOK
Get-Item "$env:USERPROFILE\.claude\projects\d--Project-homelab-consolidation\memory" | Select-Object Name, LinkType, Target
エクスプローラーで見ると、memoryのアイコンに矢印が付いています。
この後、新しいセッションで「前の話、どこまで進んだっけ?」と聞き、Claude Codeが前の話を覚えていることを確かめました。ここまではGitがなくてもでき、memory.oldに戻せば元通りです。
ジャンクションを消すときの注意
PowerShellのRemove-Item -Recurseなどでジャンクションを消すと、向こう側の実体(リポジトリの中のメモリ)まで消えることがあります。元に戻すときや、張り直すときなど、ジャンクションだけを外すには、次のコマンドを使います。
cmd /c rmdir "$env:USERPROFILE\.claude\projects\d--Project-homelab-consolidation\memory"
(3) 中身を確かめて、最初のcommitをする
メモリには、Claudeとの会話から拾った個人情報が自然にたまっています。 私の場合、パスワードはありませんでしたが、メールアドレスとAWSのアカウントIDが入っていました。Privateリポジトリなら許容範囲ですが、伏せてからcommitしました。commitした後だと履歴に残るので、消すのが大変です。
Claude Codeに探してもらったもの:
- パスワード、トークン、秘密鍵(
password、token、secret、ghp_など) - メールアドレス、12桁の数字(AWSのアカウントID)、住所・電話番号、グローバルIP、プロダクトキー
秘密鍵を含むログのフォルダなどは、.gitignoreでGitの対象から外します。また、改行コードをLFに揃えるため、.gitattributesも置きました。どちらもリポジトリの一番上に、VS Codeなどのエディターで作ります(PowerShellの>`などで作ると、文字コードや改行コードが変わる場合もあります)。
.gitignore(Gitの対象から外すもの):
# 秘密鍵・パスワードを含むログ
logs/
# マザーボードのマニュアル(サイズが大きく、メーカーの著作物)
*.pdf
.gitattributes(テキストファイルをすべてLFにする):
* text=auto eol=lf
2つのファイルを置いたら、PowerShellで最初のcommitをします:
git init -b main
git add .
git status --short # 除外したものが入っていないか確認
git commit -m "最初のcommit: 手順書とClaude Codeのメモリ"
(4) GitHubのPrivateリポジトリにpushする
2台のPCでメモリを同期するためのリポジトリを、GitHubの右上の「+」→「New repository」で作ります。
- Privateを選ぶ
- 「Add README」はオフ、
.gitignoreとlicenseもなし(GitHub側に最初のcommitができると、手元のcommitとぶつかるため)
READMEは手元で作り、「新しいPCでの準備」「毎回のpull・push」を書いておきました。ノートPCでの作業は、このREADMEを見ながら進めます。
git add .
git commit -m "READMEを追加"
git remote add origin https://github.com/<ユーザー名>/<リポジトリ名>.git
git push -u origin main
最初のpushではGit Credential Managerの「Connect to GitHub」画面が出ます。「Sign in with your browser」で許可すると、次からは出ません。
6. 手順(2台目: ノートPC)
(1) cloneする
git clone https://github.com/<ユーザー名>/<リポジトリ名>.git C:\Project\homelab-consolidation
Privateリポジトリは読み取るだけでもサインインが必要なので、初めてcloneするときは、ノートPCでも「Connect to GitHub」の画面が出ます。
(2) Claude Codeに一度話しかけて、フォルダ名を確かめる
cloneしただけでは、~\.claude\projects\にこのプロジェクトのフォルダがありません。VS Codeでフォルダを開き、Claude Codeのパネルを開いただけでもまだできません。Claude Codeに一度話しかけると、c--Project-homelab-consolidationができました(ドライブレターは小文字)。
(3) 空のmemoryを消して、ジャンクションを張る
Claude Codeは最初に話しかけた時点で空のmemoryフォルダを作るので、そのままmklinkすると「既に存在するファイルを作成することはできません」で失敗します。空の普通のフォルダであることを確かめてから消します。
$p = "$env:USERPROFILE\.claude\projects\c--Project-homelab-consolidation"
Get-Item "$p\memory" | Select-Object FullName, LinkType, Target # LinkTypeが空 = 普通のフォルダ
Get-ChildItem "$p\memory" # 何も出ない = 空
Remove-Item "$p\memory"
cmd /c mklink /J "$p\memory" "C:\Project\homelab-consolidation\claude-memory"
(4) 新しいセッションで確かめる
ノートPCで新しいセッションを始めて「分かりますか?」と聞くと、メインPCで話した内容(前の記事の閲覧数など)を覚えていました。Claude Code側が前の話を覚えている、というのは不思議な感覚でしたが、成功した!と嬉しく思いました。
7. 運用: pull忘れとpush忘れを防ぐ
毎回の流れは「始める前にpull → 新しいセッション → 終わったらcommit・push」です。忘れそうなので、起動時に知らせるフックと、終わりに打つコマンドを作りました。
pullしたら、新しいセッションを始める
メモリはセッションを始めたときに読み込まれます。 ノートPCでメモリを書き換えてpushしたのに、メインPCのClaude Codeがその内容を知らない、ということがありました。原因は、pullする前に始めたセッションのまま話していたことでした。新しいセッションを開く代わりに、/clearと打っても読み込み直されます(それまでの会話は消えます)。
起動時に、pullしていない変更を知らせる(SessionStartフック)
セッション開始時(または/clearコマンド実行時)に、下記のような表示をする運用としました。
セッション開始前にpullして、手元のリポジトリがGitHubと同じ状態になっているとき:
✓ GitHubと同じ状態です。作業の終わりには /save-git を打ってください
もう一方のPCでpushした変更を、まだpullしていないとき:
⚠ GitHubにまだpullしていない変更が1件あります。git pullしてから、新しいセッションを始めてください
このときはClaude Codeも、最初の返答でgit pullを打つように教えてくれます。
参考: 設定ファイルとスクリプト
私はこんな感じで作りました。参考程度にどうぞ。
.claude/settings.json:
{
"hooks": {
"SessionStart": [
{
"matcher": "startup|clear",
"hooks": [
{
"type": "command",
"command": "bash .claude/hooks/check-pull.sh",
"timeout": 30,
"statusMessage": "GitHubとの差を確認中..."
}
]
}
]
}
}
.claude/hooks/check-pull.sh(Git for Windowsのbashで動かしています。実際のものから、動作確認用のログなどを省いています):
#!/bin/bash
# セッション開始時に、GitHubにまだpullしていない変更があるかを表示する(pullはしない)
cd "$(git rev-parse --show-toplevel 2>/dev/null)" || exit 0
if ! GIT_TERMINAL_PROMPT=0 git fetch -q origin 2>/dev/null; then
echo '{"systemMessage":"⚠ GitHubに接続できず、pullが必要か確認できませんでした"}'
exit 0
fi
behind=$(git rev-list --count HEAD..origin/main 2>/dev/null) || exit 0
if [ "$behind" -gt 0 ]; then
echo "{\"systemMessage\":\"⚠ GitHubにまだpullしていない変更が${behind}件あります。git pullしてから、新しいセッションを始めてください\",\"hookSpecificOutput\":{\"hookEventName\":\"SessionStart\",\"additionalContext\":\"GitHubにまだpullしていないcommitが${behind}件ある。最初の返答で、git pullして新しいセッションを始めるよう伝えること。\"}}"
else
echo '{"systemMessage":"✓ GitHubと同じ状態です。作業の終わりには /save-git を打ってください"}'
fi
systemMessageは画面に出る表示、additionalContextはClaudeに渡す情報です。VS Code拡張では表示が目に入らないことがあったので、Claudeからも伝えてもらうようにしました。
終わりに/save-gitを打つ
終了時に自動でcommit・pushするフックも作れますが、何がGitHubに上がるかを毎回見たいので、自分で打つコマンドにしました。.claude/commands/save-git.mdに、Claudeへの指示を書いています。
-
git statusとgit fetchで、未commit・未push・未pullを確かめる - 未pullがあれば止まって相談する(
git pullや強制pushは勝手にしない) - 差分を見て、秘密鍵・パスワード・メールアドレスなどが入っていないか確かめる
- 日本語の短いメッセージでcommitしてpushする
- 何をcommitしたかを一言で伝える
8. つまずいたところ
| つまずいたこと | 原因 | どうしたか |
|---|---|---|
ノートPCに~\.claude\projects自体がない |
このプロジェクトでClaude Codeに一度も話しかけていなかった | VS Codeでフォルダを開き、Claude Codeに一度話しかけた |
ノートPCでmklinkが「既に存在するファイルを作成することはできません」で失敗 |
Claude Codeが最初に話しかけた時点で空のmemoryを作っていた |
空の普通のフォルダだと確かめてから消し、張り直した |
| メインPCのClaude Codeが「メモリが更新されていない」と言った | pullする前に始めたセッションだった | pullしてから新しいセッション。起動時のフックも作った |
ノートPCでつまずいたときは、正直「Claude Codeが書いてくれた手順どおりにやったのに、うまくいかないじゃん!」と思いました。でも落ち着いて、コマンドのエラーなどをWeb版のClaudeに相談しながら対処しました。
9. まとめ
ジャンクションとGitHubのPrivateリポジトリで、メインPCとノートPCのどちらからでも前の話の続きからClaude Codeと相談できるようになりました。
- メモリの場所は変えられないので、ジャンクションでリポジトリの中に向ける。これでドライブレターを揃えなくてよい
- commitする前に、メモリの中の個人情報を探す
- pullしたら新しいセッション。忘れそうなら、起動時のフックで知らせる
- 同じメモリを、2台同時に書き換えない(1台の作業をpushしてから、もう1台でpull)
この作業は、Claude Codeと相談しながら進めました。コマンドは自分で打ち、Claude Codeに説明と確認をしてもらいました。この記事も、Claude Codeの下書きをもとに書いています。
設定や手順は、さすがClaude Codeだと思いました。でも、一番苦労したのは運用の部分で、何度も相談しました。pullを忘れたらどうなるか、どのタイミングで知らせれば気づけるか……。仕組みはすぐに作れても、毎日使い続けられる形にするには、実際に使う自分がAIと一緒に考える必要がありました。
参考
記事:
- ClawSouls: memory git sync(英語、シンボリックリンクでメモリをGitに入れる)
- chezmoiでメモリを管理する例(英語)
- libecity: Googleドライブとジャンクションで会社PCと家PCをつなぐ
専用ツール(あることは確認しましたが、私は試していません):
-
claude-sync(
~/.claudeのメモリや設定を、Gitやクラウドのフォルダ経由で同期する) - clsync(共有のGitリポジトリ経由で同期し、AIで内容をまとめる)



