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越しでやるのの確認か。今日はここまで!