svnからgitへ移行するためのメモ
この記事は外部の日記(ひびろぐ)からマルチポストしています。見た目がおかしいときは本家を参照してやってください。
本家→http://exth.net/~tgbt/wordpress/2011/04/28/3731/
-
-
- -
-
中央集権リポジトリ(単一リポジトリ)だと夏の停電時にハマることになるんじゃないかという不安を解決するために分散リポジトリに手を出してみるテスト。……移行できるのか?
とりあえず、すごく良く使う基本的な作業のマッピングを考えてみることにする。
コミット時のコメント付加とかはとりあえず省略で……。
リポジトリ作成、作業開始(ローカルにリポジトリを置く想定)
cd mkdir repos cd repos svnadmin create repo
~/repos/repoという名前のディレクトリが作られて、中に管理情報が格納される
cd svn checkout file:///home/USERNAME/repos/repo ./svnwork
svnworkというディレクトリにリポジトリがチェックアウトされるので、中で作業をする。
svnworkの中には.svnディレクトリが作られる。.svnに格納されているのはリポジトリを参照するための情報。
- git
cd mkdir gitproj cd gitproj git init
いきなりinitして、その場で作業をすれば良い。.gitディレクトリが作られる。
.gitディレクトリはリポジトリその物の情報も持つようで、svnでいうと.svn+repoディレクトリそのものな感じ?
ファイル追加、変更、復旧
cd svnwork echo "hoge" > test.txt svn add test.txt svn commit test.txt # test.txtを明示しなくても良い echo "fuga" > test.txt svn commit test.txt # test.txtを明示しなくても良い echo "huga" > test.txt svn revert test.txt # test.txtを明示しなくても良い
最終的にtest.txtの中身はfugaになる。
- git
cd gitproj echo "hoge" > test.txt git add test.txt git commit echo "fuga" > test.txt git add test.txt git commit echo "huga" > test.txt git checkout test.txt
毎回addしなおすそうな。
revertに対応するのはcheckoutっぽい。
作業コピーを作成する
cd mkdir svnwork2 cd svnwork2 svn checkout file:///home/USERNAME/repos/repo ./
指定するのはsvnadminで作成したディレクトリ。カレントディレクトリに.svnとtest.txtが出現。作られるのはあくまで作業コピー。
- git
cd mkdir gitwork2 cd gitwork2 git clone ../gitproj ./
cloneで指定するのは.gitがあるディレクトリ。もしくは.gitそのもの。カレントディレクトリに.svnとtest.txtが出現。作られるのはリポジトリのコピーなのでさらにこいつをcloneすることも可能。
作業コピー間の同期
そもそもrepos/repoが「大元」なので、こいつをcheckout/update/commitすれば衝突に気がつくし同期もとれる。逆に言えば、repos/repoにアクセスできなくなったらゲームオーバー。だから中央集権。
- git
.gitが「大元」を兼ねているのでこいつらの同期をとる必要がある。そこが分散。
cd mkdir gitbp.git cd gitbp.git git init --bare
「--bare」のオプションでベアプロジェクトを作る。gitbp.git以下には.gitだけが作られる。
cd cd gitproj git push /home/USERNAME/gitbp.git master
gitbp.gitにgitprojの情報が格納される。
cd mkdir gitworkA cd gitworkA git clone /home/USERNAME/gitbp.git .
gitbp.gitのcloneを作成。test.txtも.gitも手に入った。
(gitworkAにいる) echo "hogehoge" > test.txt git add test.txt git commit git push
こちらでファイルを書き換えてadd/commitすればローカルDB(ローカルの.git内)が更新される。
その後、pushするとgitbp.gitへ更新情報が伝搬する。
cd mkdir gitworkB cd gitworkB git clone /home/USERNAME/gitbp.git .
改めて別ディレクトリにcloneしてみるとtest.txtの中身はhogehogeに更新されている。
後はgitworkAとgitworkBでお互いにpull, add, commit, pushを繰り返せば良い。
衝突すれば例によってdiffられるので、修正してcommit。
うーん、とりあえずここまで理解すれば……いや、あっていれば作業に使えるかな。
あとはssh越しでやるのの確認か。今日はここまで!