GitHubにあげたリポジトリを分割する場合の手順を忘れそうなので以下にまとめます。
以下の例ではGitHubのFinalstreamCommonsからFinalstreamCommons.Coreを切り出すというストーリーです。
あと以下の手順はGitHubでなくても同じだと思います。
1.分割したいリポジトリをリポジトリ内の1つのフォルダにまとめる。
今回のケースではCoreというフォルダにまとめます。このとき、コミットはしますが、プッシュはしないでください。
2.GitHubに新しいリポジトリを作成する。
例ではFinalstreamCommons.Coreというリポジトリを作ります。
3.SourceTreeのコンソールを起動して、元になるリポジトリをアクティブにしてコンソールを開く
gitコマンドを実行する場合、SourceTreeを使うと簡単で安全です。
SourceTreeをインストールされてない方は以下からダウンロードできます。サイトは英語ですけどアプリは日本語で使えます。
もちろんSourceTreeを使わずにコマンドプロンプトからでもOKです。
$ cd .. $ mkdir FinalstreamCommons.Core
4.元のリポジトリからクローンする。
続いて以下のコマンドを入力します。
$ git clone FinalstreamCommons/ FinalstreamCommons.Core/ Cloning into 'FinalstreamCommons.Core'... done.
5. コンソールを閉じて、分割先のリポジトリをSourceTreeに登録する。
新しく作ったリポジトリのフォルダをドラッグ&ドロップでOK
6. 分割先のリポジトリをアクティブにしてコミットしておく。
これをしておかないと次のコマンドでエラーになる。プッシュはしない。
7. 分割先のリポジトリでSourceTreeのコンソールを開く。
以下のコマンドを入力することでCoreフォルダに関連するファイルとコミット履歴を残して、ほかのものを削除します。
$ git filter-branch --subdirectory-filter Core/ HEAD Rewrite 7eaa3d4b9e838a332985626325ccc50ff5b14684 (3/3) Ref 'refs/heads/master' was rewritten
すると分割先のリポジトリはCoreフォルダ内のファイルのみになります。
8. リモートリポジトリを変更
以下のコマンドを実行すればわかりますが、このままだとリモートリポジトリがローカルの分割前のリポジトリ(FinalstreamCommons)になっているので、この状態でプッシュすると分割元のCoreフォルダ以外のファイルが消えますので注意!
$ git remote -v origin p:/finalstream/Source/Repos/FinalstreamCommons/ (fetch) origin p:/finalstream/Source/Repos/FinalstreamCommons/ (push)
なので以下のコマンドを実行してリモートリポジトリを変更します。 実行後にもう一度リモート先を確認します。
$ git remote set-url origin https://github.com/finalstream/FinalstreamCommons.Core.git $ git remote -v origin https://github.com/finalstream/FinalstreamCommons.Core.git (fetch) origin https://github.com/finalstream/FinalstreamCommons.Core.git (push)
そして最後にプッシュして完了です。 Githubでリポジトリ生成の際にLicenseとかReadmeとか追加してた場合はエラーになるのでプッシュの前にプル(取り込み)しましょう。
$ git pull origin master $ git push -u origin master
9.分割先のリポジトリにcsprojをコピーして、プロジェクトを編集する。
残念ながらプロジェクトファイルは分割されないので自分でコピーします。
コピーしたら名前を変更して開いてプロジェクト情報を書き換えたり、元のプロジェクトからファイルをコピーしたりしてエラーを取り除きます。
そして参照コンポーネントが見つかりませんみたいなエラーがでたら以下のエントリーを参考にしてください。
10.分割元のプロジェクトを開いて切り出したファイルを削除する。
切り出したファイルは元のプロジェクトから削除すれば完了です。
長かったー。もっといいやり方をご存知のかたがおられましたらぜひ教えてください。