プログラムを中心とした個人的なメモ用のブログです。 タイトルは迷走中。
内容の保証はできませんのであしからずご了承ください。

2018/10/16

TortoiseGit で SubTree を使用する

event_note2018/10/16 8:37

と書いておいて何ですが、現時点では 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 のときと同じです。
--squashsubtree add のときと同じです。

git subtree pull --prefix=SubTree_Child child master --squash