Git レポジトリの分割方法

作成

したいこと

レポジトリ内のディレクトリを、それぞれ新しいレポジトリとして登録したい。

.
└── Thesis <--> git@github.com:user/Thesis.git
    ├── thesis
    │   └── thesis.tex
    └── presentation
        ├── handout.tex
        └── slides.tex

例えば、これ (上) をこう (下) したい. <--> はローカルとリモートの対応関係を表す.

.
├── Presentation <--> git@github.com:user/Presentation.git
│   ├── handout.tex
│   └── slides.tex
└── Thesis <--> git@github.com:user/Thesis.git
    └── thesis.tex

やりかた

Git で複数のリポジトリをまとめたり、逆に切り出したりする」を参考にしました。

まずは、Thesis のクローンであるローカルリポジトリ Presentation を作成します。

% mkdir Presentation
% git clone Thesis Presentation

コマンド git filter-branch で、レポジトリの内容をディレクトリ /presentation の内容で置き換えます。

% cd Presentation
% git filter-branch --subdirectory-filter presentation HEAD

この時点でこんな感じです。

.
├── Presentation <--> Thesis
│   ├── handout.tex
│   └── slides.tex
└── Thesis <--> git@github.com:uesr/Thesis.git
    ├── presentation
    │   ├── handout.tex
    │   └── slides.tex
    └── thesis
        └── thesis.tex

レポジトリ Presentation のリモート URL を書き換えます。

% git remote set-url origin git@github.com:user/Presentation.git
% git push

Thesis についても同様にサブディレクトリ thesis でフィルタして置き換えます。

% cd ../Thesis
% git filter-branch --subdirectory-filter thesis HEAD
% git push -f

これで完了です。下のようになっているはずです。

.
├── Presentation <--> git@github.com:user/Presentation.git
│   ├── handout.tex
│   └── slides.tex
└── Thesis <--> git@github.com:user/Thesis.git
    └── thesis.tex

お疲れ様でした。