SubversionのリポジトリをGitリポジトリに移行する
私が一番最初に使ったバージョン管理システムはCVSでした
あれがなければ、当時の無茶なチーム開発は不可能だったと思いますが、
使いづらい面もあって、ある程度運用でカバーしなければなりませんでした
それを解決したのがSubversionで、
今の会社に至るまで、公私ともに使い続けていました
しかし、時代は流れ、分散型リポジトリが主流となり、
私自身、数年前から使い出したGitに慣れてしまったのもあって、
もうSubversionには戻りたくありません(´-ω-)
ちょうど、こちらのコラムにもそんな話が
- 作者: 森田創,cho45,ミック,増井俊之,山本陽平,角谷信太郎,中島拓,縣俊貴,大塚知洋,伊藤直也,小飼弾,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2011/10/15
- メディア: 大型本
- 購入: 52人 クリック: 724回
- この商品を含むブログ (43件) を見る
現在開発中のシステムはGitで管理しているので、
社内の環境を改めて整備するにあたり、
svn用の環境を再度作るのは面倒だな・・・と
とはいえ、既存システムのコードはsvnで管理されており、
そこには大量の「記録」や「歴史」が残っているので、
それを捨てるわけにもいきません
例によって前置きが長くなりましたが、
svnからgitにリポジトリを移行したときの手順をメモしておきます...φ(・ω・`)
概要
具体的なやり方は以下を見てもらうのが確実です
svn の repository を git の repository に変換する方法 | 株式会社メッサリバティ
基本的にはgit-svnを使えばいいわけですが、
適当にやるとtrunk / branch / tagsの情報が失われてしまいます
(他の記事を見て適当にやってみて、頭を抱えたという・・・)
大雑把な流れとしては以下の通りです
- auther変換定義ファイルを作る
- svnリポジトリからgitでコードを引っ張り出す
- localに作業用リポジトリを切る
- svnのtrunkを作業リポジトリのmasterとしてpush
- svnのbranchを作業リポジトリのbranchとしてpush
- svnのtagsを作業用リポジトリのtagとしてpush
- 作業リポジトリを丸ごとどこかにコピーするか、どこかのremoteへpush
以下、適当な作業ディレクトリでやります
cd ~/gittemp
ユーザ変換定義
まず、authers.txtを作ります
「svnのユーザ名 = gitのユーザ名」というだけのファイルです
vi authers.txt parrot = parrot <parrot@example.hoge>
svnリポジトリのclone
次に、svnリポジトリからgit形式でcloneしてきます
もしgit-svnをインストールしてない場合は、先にやっておきましょう
(CentOS5.xの場合はrpmforgeにgitとgit-svnがある)
sudo yum install git-svn git svn clone -A authers.txt -s [svn-repo-path] [git-repo-name]
「-s」をつけるのが最大のポイントで、
以下の処理が行われます
- 最後にsvn-commitしたtrunk or branchをmasterとしてclone
- ここが問題
- svn-trunkをremote-branchとして定義
- svn-branchをremote-branchとして定義
- svn-tagsを「tags/xxx」というremote-branchとして定義
- remote-branchは「git branch -r」で見える
最後にsvn-commitしたのがtrunkなら問題ないのですが、
branchだった場合、そちらを「git-master」として扱ってしまうので、
そのままpushすると大惨事になりますΣ(゚Д゚;≡;゚д゚)
作業用リポジトリ作成
とりあえず、localでpushするための新規リポジトリを切ります
git init --bare [local-repo-name]
「git init --bare」はremoteで使うリポジトリを作る場合のお約束ですね
これをcloneしたリポジトリにaddしましょう
cd [git-repo-name] git remote add origin [local-repo-path]
「正しい構成」をこの「origin」にpushしていきます
svn-trunkをgit-masterとしてpush
先ほども書いたように、cloneしてきたmasterは、
必ずしもsvnのtrunkとは限りません
そこで、remoteのtrunkをlocalに引っ張ってきて、
それをmasterとしてoriginにpushします
git branch local-trunk refs/remotes/trunk git push origin local-trunk:master
svn-branchをgit-branchとしてpush
他のbranchについても基本は同じです
いったんlocalに引っ張ってきて、gitのbranchとしてpushします
全てのbranchについて同じ作業を繰り返します
git branch local-hoge-branch refs/remotes/hoge-branch git push origin local-hoge-branch:hoge-branch