アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

Subversionのリポジトリ下でgitを使ってみよう

こんにちは、熊谷です。

今まで長い間バージョン管理システムとしてSubversionを使っていました。特に不満もなく使い慣れているシステムなのでずっと使っていたのですが、あるとき、こういう環境でSubversionを使うのはちょっと不便かもしれないという状況が生まれ、いろいろ考え調べてみた結果、gitが使えるのではないかという結論に達しまして、早速使ってみました。

そもそもSubversionとgitの違いは何なのか。Subversionは集中型、gitは分散型のバージョン管理システムで、Subversionは中央のリポジトリに対してコミットを行っていくのですが、gitは各ユーザが持つローカルのリポジトリに対して行います。そして、ローカルのリポジトリの内容を中央のリポジトリに反映したり、別のユーザが持つリポジトリを取得したり反映したりといったことが出来ます。

また、既にSubversionリポジトリがある場合、そのリポジトリを中央リポジトリとして使いローカルではgitをということもできます。そんなことで、今回はそれでいってみます。

まずは初めてgitを使うのでユーザ名やメールアドレス、色、無視するファイルの設定等々を行います。


$ git config --global user.name 'hogehoge'
$ git config --global user.email 'hogehoge@hoge.local'
$ git config --global color.ui auto
$ git config --global core.excludesfile $HOME/.gitignore

これでホームディレクトリに.gitconfigファイルが作成されます。また、無視するファイルがある場合は.gitignoreに記述しておきます。

では、次にSubversionリポジトリhttps://svn.hoge.local/repos/hoge-projectにあるとして)からgitのローカルリポジトリを作成します。


$ mkdir hoge-project
$ cd hoge-project
$ git svn clone -s https://svn.hoge.local/repos/hoge-project .

これで完了です。

gitには作業ツリー、インデックス、ローカルリポジトリといったレイヤーがあります。

流れ的にはまず作業ツリーからインデックスにaddして、


$ git add hoge_dir/hoge_file.php


インデックスからローカルリポジトリにcommit


$ git commit


そして、そのローカルリポジトリから中央リポジトリSubversionリポジトリへコミット


$ git svn dcommit


Subversionリポジトリとgitのローカルリポジトリを同期させるには


$ git svn rebase


以上が本当に最低限の流れでしょうか。

で、作業ツリーとインデックスの差分を表示したい場合は



$ git diff


インデックスとローカルリポジトリの差分を表示したい場合は


$ git diff HEAD


作業ツリーとローカルリポジトリの差分を表示したい場合は


$ git diff --cached


そして、ローカルリポジトリからファイル(例えばhoge_file_2.php)をチェックアウトしたい場合は


$ git checkout hoge_file_2.php


そんでもって、未だコミットしたくないファイルがあるけどローカルリポジトリにコミットしてあるファイルらは中央リポジトリSubversionリポジトリ)にコミットしなければならないという場合。そういう状況下でgit svn dcommitをすると


$ git svn dcommit
Cannot dcommit with a dirty index.  Commit your changes first, or stash them with `git stash'.
 at /opt/local/libexec/git-core/git-svn line 497

こんなことを言われます。そういうときは、



$ git stash
$ git svn dcommit
$ git stash apply
$ git stash drop

で作業ツリーを一時待避させてからSubversionリポジトリにコミットして、待避させたのを作業ツリーに戻して、問題なければそして不要であればその待避してあるものを削除します。

ということで、こんな感じでgitを使い始めました。まだまだ始めたばかりなので試行錯誤しながらではありますが、使いこなせるように頑張りたいと思います。