kなんとかの日記 このページをアンテナに追加

2010-04-23

VCS において Git が革新的な点

| 07:37 |  VCS において Git が革新的な点 - kなんとかの日記 を含むブックマーク

はっきりいって、GitCUI は使いづらくてわかりにくい。サブコマンド名やオプションが開発者目線で決められており、ユーザからどう見えるかという視点が欠けている。その点、Subversion はよく考えられて洗練されていたし、それを受け継いだ Mercurial も使いやすい。LinusSubversion をこき下ろす前に Git のコマンド体系を整理すべき。

ただ、Mercurial などと比べて Git が革新的にすごい点がひとつある。それは、バージョン管理システムGarbage Collection (GC) の概念を持ち込んだことだ。みんなあまり注目してないと思うけど、こいつはほんとうに kool な機能だ。

GC はもちろんプログラミング言語の分野での概念だけど、そのプログラミング言語の世界では、GC が一般的に使えるようになることでプログラミングスタイルが大きく変わった。それまでならメモリ管理を気にして、確保したメモリ領域を何度も使い回すスタイルだったけど、GC が普及してからは、メモリ管理を気にせず一時的なオブジェクトをじゃんじゃん生成することが当たり前になった。この、一時オブジェクトの生成を気にしないというスタイルのおかげで、プログラムを書くのがずいぶん楽になった。

Git にも同じことがいえる。Git は、使われなくなったコミットを掃除してくれる GC 機能があるので、一時的なコミットを気軽にじゃんじゃん作成できる。コードを変更したらとりあえずコミットしておく。気に入らなければ reset する。reset すると、どこからも参照されないようなコミットができちゃうけど、Git なら GC があるから気にしなくていい。

これが Mercurial だとそうもいかない。先に断っておくと、Mercurial のリポジトリは非常に洗練されておりGit の素朴な仕組みと比べると開発者のセンスが段違いに光ってる (つまり Mercurial の作者は Linus より頭いい、多分)。ただ、Mercurialリポジトリは追記型アーキテクチャなので、使いもしないコミットをじゃんじゃん作成してあとからなかったことにするという使い方や、今までのコミットを付け替える rebase のような機能にはうまくフィットしない。

GitMercurial のどちらがアーキテクチャとして優れているかは、結論のでない問題だと思う。かたやファイルをまるごと圧縮して差分すらとらない*1という、素朴であるがゆえに新機能を追加しやすいアーキテクチャ、かたやスクリプト言語で実装されているのに非常に高速に動作するという洗練された、しかしそれゆえに想定外の使い方には弱いアーキテクチャ。どっちのほうがすごいかは、ワシのようなものが口を出すのもはばかれる。ほんとうにどっちもすごいと思う。

ただ、GitGC を装備していてそれが実に画期的なことであるというのは、もっと知られていいはず。ワシは GitCUI がすごい嫌いで、GitX がなければ Git なんか使ってないんだけど、でも VCSリポジトリGC の概念を持ち込んだ Git の功績は末代まで讃えられるべきだと思う。

*1:packしなければ。

2010-04-22

「分散 VCS」という名前はよくない

| 07:53 |  「分散 VCS」という名前はよくない - kなんとかの日記 を含むブックマーク

GitRCS っぽい

lifeLOG + REPOsitory: 平等分散リポジトリの見せる夢

ワシもそう思う。Subversion のときはリポジトリを作って http.conf に記述して Apache 起動して…みたいな作業が必要だったけど*1GitMercurial はそういう手間が全然いらない。バージョン管理をしたいと思った瞬間にすぐできちゃう手軽さが、まさしく RCS を彷彿とさせる。分散 VCS 万歳。

あーでも、「分散」VCS という名前はよくないと思う。GitMercurial は、リポジトリが「分散」しているわけじゃなくて、単体で完結したリポジトリが相互に連携できるというだけだから、「Distributed」とは違うんじゃないかなあ。少なくともワシは最初のころ、GitP2P 的な仕組みを持っていて、コミットするとそれが複数のリポジトリに分散されて保存されるのだと勘違いしてた。勘違いを生み出す名前よくない。

ワシ的には、Subversion のほうがよっぽど「分散」的だと思うんだよね。GitMercurial と違い、Subversion はリモートリポジトリのすべてをローカルにコピーする必要はない。自分が作業するのに必要な部分だけを取ってこれて、自分が必要としないものはリモートに置いたまま。リポジトリをまるごと clone しなきゃいけない GitMercurial と比べると、こっちのほうが Distributed な感じがしない?

リポジトリをまるごと clone しなきゃいけないアーキテクチャは、下請け構造のプロジェクトには使いづらいと思うんだけど、どうですかね。末端の下請けプログラマには自分の作業範囲に関係するソースだけを与え、全体のソースは渡したくない、という要求はごく普通にあると思うんですけど。

他にも、ゲーム開発なら画像データや音楽データやムービーデータをバージョン管理したいと思うけど、それらを全員が自分のローカルマシンに保存しなきゃいけないというのは、どう考えても無駄です。

だから、GitMercurial もまだまだ改革できる余地はあると思う。


「我々の間にはチームプレイなどという都合のよい言い訳は存在せん。あるとすればスタンドプレーから生じるチームワークだけだ」

404 Not Found

GitMercurial は、まず互いに独立した Stand Alone なリポジトリがあって、それらが必要に応じて連携するというだけだから、まさに『スタンドプレーから生じるチームワーク』そのものだと思う。「分散 VCS」という呼称はやめて「SAC VCS」と呼ぶのはどうか。

*1:必須ではないけど必要ではあった

elfelf 2010/04/27 12:32 常々Distributedを「分散」ではなく「配信」と思うと,もう少しフィットする気がしています

2008-11-20

Mercurial は差分を管理しているけど Git はしていないみたい

| 08:44 |  Mercurial は差分を管理しているけど Git はしていないみたい - kなんとかの日記 を含むブックマーク


なんか、どうしても Git の動作がよくわからなかったんだけど、Git は差分を管理してなくて、各バージョンのファイルをすべてまるごと保存しているらしい。たとえば 5 MB の CSV ファイルがあったとして、それをちょこっと変更しただけでも、変更前と後のファイルは違うファイルとしてまるごと保存される。なるほど。

今まで、なんか Mercurial と違うなー、と思ってたけど、中の仕組みから違ったのね。

Mercurial でいうところの Changeset と、Git でいうところの Commit は、同じ物だと思ってたけど、ぜんぜん違いましたわ。

Git富豪的だなあ。ソースコードならテキストだから、まるごと保存したところで大した量ではないだろうけど、画像とか映像の管理には向かないよな。

Mercurialバイナリの差分はとってくれないそうだから、おんなじか。

ka-nachtka-nacht 2008/11/22 03:11 基本はそうですけど差分を利用した圧縮もしますよ。 http://www.kernel.org/pub/software/scm/git/docs/git-gc.html

2008-10-21

Git リポジトリを視覚化するツール「GitX」

| 02:03 |  Git リポジトリを視覚化するツール「GitX」 - kなんとかの日記 を含むブックマーク

Git には、Git リポジトリを視覚化する gitk というツールが標準でついているけど、これは Tcl/Tk で書かれていて、遅いし見栄えもよくない。

もし Mac OS X Leopard を使っているなら、かわりに GitX を使うといいみたい。OS X のグラフィックを使っているので、きれいでカッコイイ。


インストールは、ホームページで「Download Git」をクリックして Zip ファイルをダウンロードし、解凍してインストールするだけ。

そのあと、GitX を起動し、メニューから「GitX」→「Enable Terminal Usage...」を選ぶ。すると、gitx というコマンドラインツールがインストールされる。

コマンドラインから起動する場合は、Git リポジトリに移動して、gitx コマンドを実行するだけ。GUI から起動しなくていいとは、よくわかっていらっしゃる。


これがスクリーンショット。これは Merb の Git リポジトリを表示しているところ。コミットの流れがよくわかる。また、そのコミットでの差分が色分けされて表示される。コマンドラインで git を使う場合と比べると、ずいぶん見やすい。

f:id:kwatch:20081022011647p:image


ウィンドウの下に表示を切り替えるボタンがある。右のボタンを押すと、次のようにファイラが表示され、そのコミット時点でのファイルの内容を簡単に見ることができる。これは便利だ。

f:id:kwatch:20081022014359p:image


表示するブランチも切り替えることができる。複数のブランチを作成しているときは、「All branches」を選ぶと、ブランチがどのように枝分かれしているか見ることができる。

f:id:kwatch:20081022011649p:image


あと、ウィンドウ左上で「Commit」を選ぶと、コミットを表示する画面ではなく、コミットを実行する画面に切り替わる。つまり GUI でコミットが実行できるわけ。上半分に差分が表示され、下半分は右がコミットされるファイル、真ん中がコミットログ、左がコミットされないけど変更があるファイル、というふうに表示される。

f:id:kwatch:20081022011650p:image


コミットしたりファイルを変更したあとは、Commadキー + R と押すと、リポジトリ内容が再度読み取られて表示される。


こんな感じでした。

IDE とかと比べるとまだまだかなと思うけど、リポジトリを視覚化するツールとしてはいいんじゃないでしょうか。


SubversionMercurial と比べると、git のコマンドラインは正直いってすごくわかりにくい。でもこういうツールがあると、デザイナーでも Git が使えるようになるんじゃないかな。

2008-10-12

Mercurial や Git が使える無料のリポジトリサービスを集めてみた

| 18:25 |  Mercurial や Git が使える無料のリポジトリサービスを集めてみた - kなんとかの日記 を含むブックマーク

Git を使うなら GitHub で決まりだと思うけど、GitHub は BTS がないし、Git じゃなくて Mercurial を使いたかったので、Mercurial 版 GitHub がないか探してみた。

そのうちにいろんなリポジトリサービスが見つかったので、紹介してみる。

#sourceforge.net とか rubyforge.org とかでも repository hosting を提供してるけど、ほとんど使われてないっぽい。


  • GitHub (Git)
    • http://github.com/
    • Ruby on Rails が使ったことから一気にブレーク。Rails ユーザは皆ここを使う。
    • Issue Tracking System がないので、Lighthouse.com と併用することが多い。
    • Wiki が利用可能









以上。ほかによさそうなのがあれば教えてください。


・・・で、結局どれを使おうか。

単にリポジトリを hosting したいだけなら Bitbucket でいいと思うけど、Issue Tracking とかも使いたいから、assembla がいちばんよさそう。MercurialGitSubversion の 3 つが使えるというのも Good。

でも、Launchpad がなんかすごそうなんだよな。これを使うと、プロジェクト管理に対する考え方が変わってしまうような気がする。Launchpad を使うためだけに Bazzar を勉強してみるか。


参考:

ursmursm 2008/10/14 12:50 Bitbucket はフリープランだと「プライベートリポジトリが」1つです。
パブリックリポジトリならいくつでも作れますよ。

kwatchkwatch 2008/10/14 21:35 おお、そうだったんですか。今確認したところ、確かにprivateと書かれてました。ご指摘ありがとうございました。

moriqmoriq 2008/10/22 07:59 malagmaはどうでしょう。
http://malagma.org/wiki/

hogehoge 2009/10/12 16:06 http://code.google.com/projecthosting/ もMercurial対応してます。