2015年4月14日火曜日

1つの git を複数のリポジトリに分割する方法

概要

1つの巨大なgitを複数のgit環境に分割してみたいと思います
初めは小さなプロジェクトで1つのgitからスタートしたが、次第にプロジェクトが大きくなり、その過程でgitを複数作らなくて同じgitにpushし続けた結果いろんなソースコードが混じった巨大なgitが出来てしまった
なんてことはあると思います

環境

  • git 2.1.1

分割する方法

例として自分のGitHubアカウントを使って分割してみます

分割先のリポジトリを作成する

まず分割先のリポジトリを作成しましょう
名前は何でもOKです
できれば空のリポジトリとして作成しましょう
空じゃなくてもOKですが、空リポジトリの方が簡単です
create-repo-for-split.png

分割対象のリポジトリをcloneする

これが巨大な1つgitリポジトリになります
ご自身の環境に合わせて分割したいリポジトリをローカルにcloneしてください
すでにある場合は特に何もしなくてOKです
今回はテスト用に自分のリポジトリを使ってみます

git clone https://github.com/kakakikikeke/cookbooks-emacs.git

ローカルでリポジトリをcloneする

Remoteからcloneしてきたリポジトリをローカルで操作します
まずは分割元のリポジトリを分割先のリポジトリに丸々cloneします

mkdir split-repo-test
git clone cookbooks-emacs/ split-repo-test/

これでローカル上で全く同じリポジトリができました

cloneした分割先のリポジトリでフィルタをかける

これが今回の肝となる作業だと思います
先ほどcloneした分割先のリポジトリに移動してフィルタをかけます
フィルタをかけることで必要なディレクトリ配下のみを管理git配下で管理できるようになります

cd split-repo-test
git filter-branch --subdirectory-filter files/ HEAD

とすることで files/ ディレクトリ配下をgitリポジトリで管理できるようになります
今回はサンプルにfilesというディレクトリがあるのでそれを指定していますが、ここは自身の環境に合わせて分割したいディレクトリを指定してください
完了後にlsでリポジトリを確認するとフィルタされたディレクトリ配下のリソースだけがあると思います
またgit logでログを確認すると他のディレクトリに対するコミットログがなくなっていると思います

リモートリポジトリを変更する

このままだとリモートリポジトリは分割元のリモートリポジトリになっているので push すると大変なことになります
分割後のリポジトリは作業冒頭でGithub上に作成したリモートリポジトリになるのでこれに変更します

cd split-repo-test
git remote set-url origin https://github.com/kakakikikeke/split-repo-test.git

これでpushしてみましょう

git push -u origin master

認証が成功して push できたあとでGithubを見てみると分割されたリソースがpushされていることを確認できると思います
goal-repo-for-split.png

すでに誰かがmasterブランチにpushしてしまっている場合は一旦git pullしてから push しましょう

最後に

今後は分割したリポジトリにコミットしていけばOKです
既存のリポジトリはgit rmしちゃっていいと思いますが、git rmだけだと歴史には残ってしまうので歴史からも完全に削除したい場合は、こちらもgit filter-branchを使うといいみたいです

0 件のコメント:

コメントを投稿