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を使い始めました。まだまだ始めたばかりなので試行錯誤しながらではありますが、使いこなせるように頑張りたいと思います。