OBONO’s Diary

へっぽこプログラマの戯言

GitHub

Google Code がサービスを終了するという事で、こちらでも勧められている GitHub に移行したのが水曜日の話。その際、ちょっとトリッキーな事をしたので、備忘録の意味合いも込めて記事を書く。


Google Code を利用開始した当初、1アカウントで作成できるプロジェクト数に制限があるという事で、プロジェクトを一つだけ作成して、各アプリのソースはサブディレクトリを掘って運用するというケチな事をやっていた。(実際は、上限に達するほどアプリは作ってないので、ハッキリ言って無意味だったんだけど)
その結果として以下のような構造になっていた。

https://obnsoft-sandbox.googlecode.com/svn/
 +- tags
 |   +- Chred_v0.0.1
 |   +- Chred_v0.0.2
 |   +-  :
 |   +- DiceCalendar_v0.0.1
 |   +- DiceCalendar_v0.0.2
 |   +-  :
 |
 +- trunk
     +- Chred
     +- DiceCalendar
     +- DiceWidget
     +- Genesis
     +-  :

GitHub では public なリポジトリは特に数に制限がないようなので、subversion から Git になるわけだし、この際、アプリ毎にリポジトリを分ける事にした。


まず、普通に Export して、上記のツリー構造そのままの obnsoft-sandbox リポジトリを作成。
その後、空のリポジトリ Chred を作成した上で、以下の git コマンドを使用して、Chred に関連するものだけを抽出して git push。

git clone https://github.com/obono/obnsoft-sandbox.git .
git filter-branch --subdirectory-filter Chred
git tag -d DiceCalendar_v0.0.1 DiceCalendar_v0.0.2 ... (Chred以外のタグ全て)
git remote rm origin
git remote add origin https://github.com/obono/Chred.git
git push --all
git push --tags

他のアプリについても同様の操作を繰り返し、結果として11リポジトリを追加で作成。やりたい事が実現できて、めでたしめでたし。


参考にしたのはこちらの記事。ただ、こちらの状況とは微妙に異なっていて、filter-branch --subdirectory-filter する際に '-- --all' まで書いてしまうと、tags の方の内容が綺麗サッパリ無くなってしまったので、そこだけは注意。
まぁ、そもそも subversion の時から変態的な構造にしてしまった自分がオカシイだけで、普通の人はあまり気にしなくて良いのかもしれない。


参考:gitの特定のディレクトリをブランチ毎別リポジトリにする方法