1
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?

Claude Codeのメモリを、GitHub経由で2台のPCで共有する

1
Last updated at Posted at 2026-10-25

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台のメモリが揃います。

01_diagram.png

ジャンクションとは

ジャンクションは、元の場所に置く「別のフォルダへ通じるドア」です。プログラムからは普通のフォルダに見えるので、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のアイコンに矢印が付いています。

02_explorer.png

この後、新しいセッションで「前の話、どこまで進んだっけ?」と聞き、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とぶつかるため)

03_new-repository.png

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」で許可すると、次からは出ません。

04_connect-github.png

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への指示を書いています。

  1. git statusとgit fetchで、未commit・未push・未pullを確かめる
  2. 未pullがあれば止まって相談する(git pullや強制pushは勝手にしない)
  3. 差分を見て、秘密鍵・パスワード・メールアドレスなどが入っていないか確かめる
  4. 日本語の短いメッセージでcommitしてpushする
  5. 何を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と一緒に考える必要がありました。

参考

記事:

専用ツール(あることは確認しましたが、私は試していません):

  • claude-sync(~/.claudeのメモリや設定を、Gitやクラウドのフォルダ経由で同期する)
  • clsync(共有のGitリポジトリ経由で同期し、AIで内容をまとめる)
1
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
1
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?