Git Subtree

Git Subtree は、プロジェクト(ない)(ほか) の Git リポジトリを()()(べつ)方法(ほうほう) で、Submodule より使(つか) いやすいです。

共有 repo を作成

この repo は複数(ふくすう) のプロジェクトで共有(きょうゆう) するリソースを保存(ほぞん) します((れい).claude/skill):

mkdir claude-skill
cd claude-skill
git init
mkdir skill
echo "echo 'Hello from skill'" > skill/demo.sh
git add .
git commit -m "initial commit of skill"
git branch -M main
git remote add origin https://github.com/your-org/claude-skill.git
git push -u origin main
共有(きょうゆう) repo が完成(かんせい) し、(ほか) のプロジェクトから pull/push できます。ここの skill/ は repo (ない) のディレクトリで、(あと) でプロジェクト(ない).claude/skill対応(たいおう) します。

プロジェクト A で Git を作成

mkdir project-A
cd project-A
git init
git remote add origin https://github.com/your-org/project-A.git
git branch -M main
git add .
git commit -m "initial commit for project-A"
git push -u origin main
  • origin → プロジェクト自体(じたい) のリモート
  • (つぎ) に subtree をプロジェクトに統合(とうごう) します

Subtree を追加

# 1. リモート共有 repo を追加
git remote add claude https://github.com/your-org/claude-skill.git
git fetch claude

# 2. subtree を統合
git subtree add --prefix=.claude/skill claude main --squash

パラメータ説明

パラメータ説明(せつめい)
--prefix=.claude/skillプロジェクト(ない) に subtree を配置(はいち) するディレクトリ
claudeリモート(めい) (URL ではない)、どの repo かを Git に(つた) える
mainリモートブランチまたは commit、どのブランチを pull するか
--squashsubtree の commit を単一(たんいつ) の commit に圧縮(あっしゅく) (プロジェクト履歴(りれき)保護(ほご)

結果

project-A/
 └─ .claude/
      └─ skill/
           └─ demo.sh

これでプロジェクト A は .claude/skill内容(ないよう)直接(ちょくせつ) 使用(しよう) できます。

Subtree を更新

共有(きょうゆう) repo から(あたら) しい内容(ないよう) を pull:

cd project-A
git fetch claude
git subtree pull --prefix=.claude/skill claude main --squash

これでリモートの最新(さいしん) 内容(ないよう).claude/skill更新(こうしん) されます。

原理(げんり) :リモートを fetch → プロジェクトディレクトリに統合(とうごう) → commit を圧縮(あっしゅく)

プロジェクトの修正を共有 repo にプッシュ

プロジェクト A で .claude/skill修正(しゅうせい) し、claude-skill同期(どうき) したい場合(ばあい)

git subtree push --prefix=.claude/skill claude main
パラメータ説明(せつめい)
pushプロジェクト(ない) の subtree の修正(しゅうせい) をリモートにプッシュ
--prefixプロジェクト(ない) の subtree ディレクトリを指定(してい)
claudeリモート(めい)
mainプッシュ(さき) のリモートブランチ

複数プロジェクトでの共有

プロジェクト B でも同様(どうよう)操作(そうさ)

git remote add claude https://github.com/your-org/claude-skill.git
git fetch claude
git subtree add --prefix=.claude/skill claude main --squash

操作(そうさ) フローはプロジェクト A と(おな) じです。共有(きょうゆう) repo の更新(こうしん) やプッシュも(おな) じコマンドを使用(しよう) します。

よく使う Subtree コマンドまとめ

機能(きのう)コマンド説明(せつめい)
subtree を追加(ついか)git subtree add --prefix=.claude/skill claude main --squashプロジェクトに(はじ) めて共有(きょうゆう) repo を統合(とうごう)
更新(こうしん) を pullgit subtree pull --prefix=.claude/skill claude main --squash共有(きょうゆう) repo からプロジェクト(ない) の subtree を更新(こうしん)
修正(しゅうせい) をプッシュgit subtree push --prefix=.claude/skill claude mainプロジェクトの修正(しゅうせい)共有(きょうゆう) repo に送信(そうしん)

Submodule vs Subtree

特性(とくせい)SubmoduleSubtree
Clone 方法(ほうほう)追加(ついか)--recurse-submodules必要(ひつよう)直接(ちょくせつ) clone できる
更新(こうしん) 方法(ほうほう)2(そう) の commit単一(たんいつ) の commit
履歴(りれき) 記録(きろく)分離(ぶんり) された履歴(りれき)プロジェクト履歴(りれき)統合(とうごう)
適用(てきよう) シナリオバージョンを正確(せいかく)制御(せいぎょ) する必要(ひつよう) がある場合(ばあい)シンプルな共有(きょうゆう) リソース