概要
1つの巨大なgitを複数のgit環境に分割してみたいと思います
初めは小さなプロジェクトで1つのgitからスタートしたが、次第にプロジェクトが大きくなり、その過程でgitを複数作らなくて同じgitにpushし続けた結果いろんなソースコードが混じった巨大なgitが出来てしまった
なんてことはあると思います
環境
- git 2.1.1
分割する方法
例として自分のGitHubアカウントを使って分割してみます
分割先のリポジトリを作成する
まず分割先のリポジトリを作成しましょう
名前は何でもOKです
できれば空のリポジトリとして作成しましょう
空じゃなくてもOKですが、空リポジトリの方が簡単です
分割対象のリポジトリを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されていることを確認できると思います
すでに誰かがmasterブランチにpushしてしまっている場合は一旦git pull
してから push しましょう
最後に
今後は分割したリポジトリにコミットしていけばOKです
既存のリポジトリはgit rm
しちゃっていいと思いますが、git rmだけだと歴史には残ってしまうので歴史からも完全に削除したい場合は、こちらもgit filter-branch
を使うといいみたいです
0 件のコメント:
コメントを投稿