sos の 作業メモ

プログラミングや英会話学習、マイルや旅行、日常生活など。最近はWebFormなASP.NETのお守りがお仕事です。

日々の生活にhappyをプラスする|ハピタス Gポイント

SubversionからGit へリポジトリを移行してみました

今頃Gitネタですみません。

手慣れたSubversionをずるずると使い続けて幾歳月。トピックブランチのトランクへのマージが面倒でたまらず、もう何年もGitに移行したいなぁと思っていたのですが、 今回新しい・・・というかソースを引き継いだものから派生させた新商品をリリースとなりましたので、せっかくなのでこいつだけでもGitへと移行することにしてみました。

すでにSubversionで開発は進んでいるのですが、リリースも一本でトランクも綺麗ですし、今まさにコードフリーズ中でして、今やらないと多分ずっとこのまま移行できなくなるという焦燥感に駆られての行動です

Gitってなに?からの始まり

今更ですが、"ものすごく流行ってて便利なバージョン管理システム"という知識とおぼろげながらの構造と用語をチョロチョロと知っているだけの状態からの移行開始です。

サルでもわかるGit入門 〜バージョン管理を使いこなそう〜 | どこでもプロジェクト管理バックログ

まずはこれでざっくりと作業を勉強。バージョン管理やマージの概念はわかっているので、コマンドラインでの操作を中心に一夜漬けしました

独習Git

独習Git

あとはこれ。会社の本棚に転がっていたので、ワークフローのとことか拾い読み。

今のプロジェクトではbacklogで情報共有をしているので、GitHub のフローで進めることにしました。(backlogにはプルリクエストの仕組みあり)

とか思ってましたが、オンプレのTeamFoundationServerを立てる方向に路線変更しました(後述)

svnリポジトリの移行

一通りGitのコマンドをマスターしたところで、既存のSubversionリポジトリをGitのリポジトリへと移行していきます。

Windowマシンで行う git-svnでのSubversionからGitへの移行方法 - Qiita

SVN から Git への移行 | アトラシアン

このあたりを参考に、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

svnリポジトリの中身を取得開始。

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システムからモバイルアプリまで、下から上まで後ろから前までをプロとして全部やってるのがウリの会社でして、割となんでも揃います。その氣になりさえすればですが(^^;

そんなわけで、リポジトリ移行編はこれにて終了です。