SubversionからGit へリポジトリを移行してみました
今頃Gitネタですみません。
手慣れたSubversionをずるずると使い続けて幾歳月。トピックブランチのトランクへのマージが面倒でたまらず、もう何年もGitに移行したいなぁと思っていたのですが、 今回新しい・・・というかソースを引き継いだものから派生させた新商品をリリースとなりましたので、せっかくなのでこいつだけでもGitへと移行することにしてみました。
すでにSubversionで開発は進んでいるのですが、リリースも一本でトランクも綺麗ですし、今まさにコードフリーズ中でして、今やらないと多分ずっとこのまま移行できなくなるという焦燥感に駆られての行動です
Gitってなに?からの始まり
今更ですが、"ものすごく流行ってて便利なバージョン管理システム"という知識とおぼろげながらの構造と用語をチョロチョロと知っているだけの状態からの移行開始です。
サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ
まずはこれでざっくりと作業を勉強。バージョン管理やマージの概念はわかっているので、コマンドラインでの操作を中心に一夜漬けしました
- 作者: リック・ウマリ,吉川邦夫
- 出版社/メーカー: 翔泳社
- 発売日: 2016/02/26
- メディア: 大型本
- この商品を含むブログ (3件) を見る
あとはこれ。会社の本棚に転がっていたので、ワークフローのとことか拾い読み。
今のプロジェクトではbacklogで情報共有をしているので、GitHub のフローで進めることにしました。(backlogにはプルリクエストの仕組みあり)
とか思ってましたが、オンプレのTeamFoundationServerを立てる方向に路線変更しました(後述)
svnリポジトリの移行
一通りGitのコマンドをマスターしたところで、既存のSubversionのリポジトリをGitのリポジトリへと移行していきます。
Windowマシンで行う git-svnでのSubversionからGitへの移行方法 - Qiita
このあたりを参考に、subversionのリポジトリから Git の ローカルリポジトリをcloneし、 新規でGitのリモートリポジトリへとpushする計画を立てました。
VMのスナップショット
何はともあれ、開発環境のVMのスナップショットをとって、いつでもなかったことにできるようにしておきます。開発環境をいじるときは必須の作業ですよね。
Git for Windowsインストール
お次はGitをインストール。適当にラジオボタンを選びながら、windowsのコマンドプロンプト用にインストールが完了。
svn 作業コピーをリネーム
念のため、ローカルのsvnの作業コピーをリネームし、元の名前で空のフォルダを作成しておきます。
git svn init
svnのリポジトリをoriginとして、gitのローカルのリポジトリを作成。svnのtagsは使っていなかったので指定していません。
git svn init -T https://hoge.hoge.hoge/hoge/trunk -b https://hoge.hoge.hoge/hoge/branches --username=hoge
svn側でSSLのクライアント認証を使っているため ちょっとややこしいことになりましたが・・・とりあえずここまではなんとかクリア。
git svn fetch
git svn fetch
ここで問題発生。 SSL通信の途中で何か気に入らないことがあるのか、謎のエラーが発生して、どうやっても進んでくれません。
証明書やそんなところの問題じゃなく、パールのモジュールがエラーを吐いてきているので根は深そうです。
こんなところで時間を浪費しても仕方がないので、svn側のhttpdの設定をいじって、一時的にhttpで通信できるようにし、configファイルの中のurlをhttpに変更してfetchを開始。
途中一回だけ止まりましたが、そこからfetchを再開して無事に完了。
最初 -b でブランチの取込をするのを忘れててやり直したのは内緒です
git checkout
ブランチを作っておきます
git branch -r
一覧で表示されたブランチを、作りながらチェックアウト
git checkout -b branchhoge branchhoge
ここでtrunkのブランチができていたのですが、どう考えてもこれは masterと同じだし、もう戻すこともないでしょうからバッサリ削除
git branch -d origin/trunk
git log
git checkout master git log --oneline
とりあえずログを眺めてみます。なんとなく見覚えのあるコミットコメントがゾロゾロと。 なんだか大丈夫そうです。
git push
テストとしてbacklogに立てたリモートレポジトリへpushしてみます。
git remote add origin https://hoge.hoge/backlog/git/HOTE/hoge.git git push origin --all
backlogでコミットログや、ファイルのdiffをちゃんと参照できました。
git clone
今度は リモートからcloneしてみます。とりあえずこれまでのフォルダをリネームして、再度同じ名前でフォルダを作成したのち、backlogのリモートからcloneしてみます。
git clone https://hoge.hoge/backlog/git/HOTE/hoge.git
hogeなフォルダの中に綺麗にcloneされてきました。これでsvnからやってきた痕跡はコミットコメントの中だけとなりました。
svnの作業コピーをコピー
綺麗になったhogeの中の.gitフォルダだけを残して全部消した後、元のsvnの作業コピーを一気にコピーして.svnフォルダだけ消しちゃいます。
元の作業コピーにはbinとかobjとかsubversionで管理対象外にしていたフォルダも多いし、何よりテストもクリアした最新版のコードですからね。これをHEADにしないで何を信用しろというのかと。
VisualStudioで確認
今回移行したプロジェクトはVisualStudioで開発していますので、早速VisualStudioで開いてみました。
いやぁ・・・すごくいいです。今のVisualStudioはデフォルトでGitに対応しているおかげで、ファイルの変更状態もアイコン表示されるし、コミット履歴なんかも右クリック一発です。幾つかリポジトリと作業コピーの間でmodifiedなファイルが出たのですが、全て改行コードの問題でした。
もしかしてsvnのリポジトリにコミットした時に、テキストはCRLFにして送るモードになっていたのかもしれません。CRLFで保存し直すと綺麗に一致してくれました。
フォルダを無視するやり方をまだgitのコマンドでは習得していないため、コードを書き始めるにはもう少しかかりそうですが、現在リリースに伴うコードフリーズ期間なので、余裕を持って作業ができます。
ということで、とりあえずリポジトリの移行はうまくいったみたいです。
つい2〜3日前はGitのリポジトリなんて全然わからなかったのですが、なんやかんやでなんとかなるもんですね(^^;
設定関連に関しては、コマンドを探すよりconfigファイルを書き換える方が早いことに気がつきました。
もっと早く移行しておけば、これまでの開発もうーんと楽だったろうと思うと、 目先の手間を惜しんで効率upをおろそかにしてはいけないなと、改めて反省しました。
さて、これで運用開始かといえば実はまだ、ここからさらにもうひと作業が残ってます。
上の方にも書きましたが、せっかくVisualStudioで開発しているのですから、リモートリポジトリも backlogではなく TeamFoundationServerを立ててそっちでやっちまおうと計画してます。
プルリクエストは便利ですが、レビューででソースにコメントされたものが、 ダイレクトにVisualStudio上で閲覧できないのはやっぱり使いにくいよなと 感じまして、効率優先でTFSに決まりました。
GitHubみたいにプラグインがあれば良いのですが見当たらないし、APIとか調査してる時間ももったいないですしね。
もしかしたらあるのかもしれませんし、なくても作れば誰かに使ってもらえるんでしょうけど・・・
あと、エンプラ系のプロジェクトなのでクラウドはご法度。全てオンプレミスで固めることになっています。
弊社はちっこい会社ながらも、ISPからMSP、そしてISVとしてWebシステムからモバイルアプリまで、下から上まで後ろから前までをプロとして全部やってるのがウリの会社でして、割となんでも揃います。その氣になりさえすればですが(^^;
そんなわけで、リポジトリ移行編はこれにて終了です。