プロジェクトで Git を使ってみた感想とか
2009/12〜2010/06 くらいまでの案件で Git を使ってみたので、その感想その他です。毎度長くてごめんなさい。
Subversion の経験はそこそこある状態でのスタートです。
リポジトリ構成のポイント
ソースコードは Git、ドキュメントは Subversion で
Git はファイル名をバイト列で管理するので、Windows と Linux の両方で使いたい場合は日本語名のファイルは使えません。(今のところ対応予定もないとのこと。ファイルのコンテンツやコミットログについては UTF-8 で統一できるので問題ありません。)
ソースコードについては日本語名のファイルは含まれないので Git 管理でいいと思いますが、ドキュメントに関しては難しいので Subversion 管理にしました。
リポジトリの単位は細かく
Git では Subversion と違ってリポジトリの一部をチェックアウトすることができませんので、リポジトリの単位を Subversion よりも細かく切っておく必要があります。
たとえば私は Subversion では
hoge ├─doc ├─envs │ ├─ci │ ├─svn │ └─trac ├─received ├─src │ ├─branches │ ├─tags │ └─trunk └─vendorsrc
こんな感じでリポジトリを構成して、
して、それぞれの環境では必要部分のみチェックアウトして使うことが多いんですが、Git ではこのような運用はできないので、
Git 自体の感想
運用がイマイチだった点は置いておいて、ツールとして見た場合の感想をさらっと書いておきます。
利点
今回 Git を使ってよかったと感じたのは以下の点です。
- 他の開発者に影響を与えずに気軽にコミットできる
- push する前であればコミット内容を書き換えられるので、間違いに気づいても取り返しがきく
- 何かミスしても(原理上)やり直しが効くので安心感がある
- GitHub をより深く利用できた
「リポジトリに接続できない状態できる」(移動中にノート PC で開発する等)というのも 分散 VCS の利点として挙げられることが多いですが、そもそもプロジェクト関係のファイルの持ち出しが禁止みたいな雰囲気なので、この点では恩恵はありませんでした。
欠点
- 学習コストが高い
- コミットログが一直線でないのでわかりにくい
- リビジョンが番号で管理できないので指定しにくい
やはり一番の問題は学習コストです。チーム内の勉強会で WEB+DB PRESS Vol.50 の Git 特集はやっておいたんですが、それでも実際使ってみると混乱していました。
Subversion に比べると
ということで、ただでさえ構造が複雑です。(もともと Subversion が「CVS はブランチ等がわかりにくかったから単純な仕組みにしよう」というノリだったはずなので、Subversion と比べて複雑なのは仕方ないですが・・・。)
その上、コマンドの体系(オプションや引数を省略した場合に何が対象になるか等)が統一されていないので、コマンドがなかなか覚えられません。ちょっと普段の運用から外れたことをやろうとすると、結構時間がとられたりしました。
経験者に聞ける環境であれば問題ないかもしれませんが、それなりに時間が取られることは覚悟しておいたほうがいいです。
運用
今回の運用(悪い例)
完全に SVN を引きずった感じの運用になっていました。
問題点/改善点
ソースコードの受け渡しやレビューの際にはに中央リポジトリに push するしかなく、dev ブランチの履歴がぐちゃぐちゃになってしまっていました。対応ごとにまとまってコミットされているわけでもないし、(当初 git pull 時に --rebase オプションをつける習慣がなかったので)不要なマージが発生しまくりでグラフが理解不能なレベルでした。このあたりはトピックブランチも使っておけばずいぶんすっきりした気がします。
「レビュー前に中央リポジトリに push する」というルールは DVCS の特長を生かせないので勿体なかったです。各自が公開リポジトリを用意しておいて、そこに push してレビュー用サーバに持って行く形がよかった気がします。そうすれば、中央リポジトリのログはより綺麗な形に保てたでしょう。
細かい Tips 等
- ブランチやマージで混乱したら、gitk --all でリビジョングラフを開いて、たまにリロードするとわかりやすいかも
- git grep が地味に便利。git で管理されているファイルすべてが対象でなくて、カレントディレクトリ以下の管理ファイルが対象なので、その点だけ注意。
- TortoiseGit は基本的な運用には耐えられるけど、git pull --rebase ができなかったり、remotes の設定がうまく使われなかったり、stash の名称を指定するオプションがなかったり?と微妙に機能不足。
- pull --rebase 相当の動作設定は設定ファイルを編集すればできた気がする(追記: branch.
.rebase を true に設定すれば OK?)ので、必要ならこれを使いましょう。 - ただ、blame は TortoiseGit のものを使っていました。履歴を追いやすいので。
- TortoiseGit にも↓に書いた stash できない問題があるみたい。
- pull --rebase 相当の動作設定は設定ファイルを編集すればできた気がする(追記: branch.
その他雑感
うまくまとまらないので適当に思ったことを書いておきます。
- レビュー手順を簡素化したい
- 今まで ReviewBoard とか Peer Review Plugin とかも試したことはあるけど、パッチをアップロードする運用はまどろっこしくて定着しなかったので、チケット番号やリビジョン範囲を指定する程度で使えるレビューツールを探したい
- コミット時のメールは送るべきか?
- SVN の運用に合わせて送るようにしてたけど、入門Git によるとこれは送るべきではないとのこと。
- ただ、著者のひとは Linux カーネルみたいな大規模なオープンソース開発を念頭に置いている気がするので、社内で少人数が使うのであればコミット時のメールは送るべきだと思う。
- そのコミットを見るだけで指摘できるような点(誤字だったりコーディングルール違反だったり一行見ただけでわかるようなロジックの不備だったり)は、早いタイミングでつぶしておいたほうがいいので。
- ただ、こうしてしまうと rebase -i のときにまたすべてのメールが送られてしまう。変更があった点だけメールが送れるような仕組みがほしい。
- push されていないコミットの情報がどこにも共有されないのがちょっと困る
- コマンド体系について
- 入門Git に「VCS を使ってデプロイするのは間違っている」みたいなことが書かれていたので、↓の主張にちょっと自信をなくしてしまった。
- 本番サーバにチェックアウトしちゃダメですか? - miauの避難所
- まあ、今回も本番サーバで pull 運用にしてるのだけど。
役に立ちそうなリンク
- Git 基礎最速マスター - 予定は未定Blog版
- 開発環境の設定なんかについても載っているのでいいかなと。
- ただ、msysGit の設定について、「最近の msysgit では ~/.inputrc は設定不要」みたいな情報も見かけたので、↓も併せて読んでおいたほうがいいかもしれません。
- msysGit では、これらの設定をすべて行っても色分けがうまくいかないコマンドがあったり、まだ完璧とはいえない気がします
- Subversion ユーザーが Git を使ってみた (基本操作編) - まちゅダイアリー(2010-05-06)
- Subversion ユーザにはオススメ。一部の概念については図もあってわかりやすい。
- RSpec の入門とその一歩先へ - t-wadaの日記