と書いておいて何ですが、現時点では TortoiseGit は SubTree に対応してませんので、コマンドで実行する必要があります。
対象とするモデル
以下のようなモデルを例とします。
SubTree で他のリポジトリを取り込む側(親プロジェクト)
- SubTreeTest_Parent1
- SubTreeTest_Parent2
SubTree で他のリポジトリに取り込まれる側(子プロジェクト)
- SubTreeTest_Child
親プロジェクトに子プロジェクトのリモートリポジトリを登録
git remote add <name> <url>
今回は以下のようにしました。
git remote add child http://xxx/
尚、これは TortoiseGit でも設定可能です。
TortoiseGit でのやり方
右クリック > [TortoiseGit] > [設定] を選択します。
サイドメニューから [リモート] を選択し、リモート
に任意の名前を、URL
にリポジトリの URL を入力し、[新規に追加]を押します。
親プロジェクトに子プロジェクトをサブディレクトリとして追加
親プロジェクトに子プロジェクトのリモートリポジトリを登録したら、次に子プロジェクトをサブディレクトリとして追加します。
git subtree add --prefix=<prefix> --squash <repository> <commit>
<prefix>
には子プロジェクトを取り込んだ際のディレクトリ名を指定します。
既存のディレクトリ名と重複しないようにします。
<repository>
は前述のリモートリポジトリの登録で <name>
に指定したリポジトリ名です。
<commit>
はコミットまたはブランチ名です。
また、--squash
オプションをつけると、親プロジェクトに取り込む際にコミットを一つにまとめてくれます。
今回は以下のようにしました。
git subtree add --prefix=SubTree_Child --squash child master
親プロジェクト内に SubTree_Child
というフォルダが作成され、その中に子プロジェクトの中身が入っているのが確認できると思います。
ここまでで SubTree による子プロジェクトの取り込みは完了です。
親プロジェクト内で子プロジェクトの変更を行う
上記までの SubTree の設定が完了していれば、あとは親プロジェクト内で子プロジェクトも自由に変更できます。
コミットやプッシュも通常通りできますが、親プロジェクト内で変更した子プロジェクトの内容を、子プロジェクトのリモートリポジトリに反映させる(プッシュする)場合には、以下のコマンドを実行します。
git subtree push --prefix=<prefix> <repository> <branch>
<prefix>
<repository>
は git subtree add
を実行したときと同じです。<branch>
にはプッシュしたい子プロジェクトのブランチを指定します。
git subtree push --prefix=SubTree_Child child master
子プロジェクトの変更を親プロジェクト内に反映する
子プロジェクトのリモートリポジトリが更新されていた場合、その変更内容を親プロジェクト内の子プロジェクトに反映させる(プルする)場合には、以下のコマンドを実行します。
git subtree pull --prefix=<prefix> <repository> <branch> --squash
<prefix>
<repository>
<branch>
は subtree push
のときと同じです。--squash
も subtree add
のときと同じです。
git subtree pull --prefix=SubTree_Child child master --squash