October 1, 2009

Grit の調査のつづき

grit

Grit の調査のつづき。
フィルをコミットする方法とか調べた。

まず、リポジトリを指定して Repo を new

> require 'grit'
> include Grit
> repo = Repo.new('.')

test というファイルを作成して、

> system 'touch test'
=> true

インデックスに add

> repo.add('test')
=> ""

そしてそれを commit

> repo.commit_index('add test')
=> "[master (root-commit) 90de066] add test\n 0 files changed, 0 insertions(+), 0 deletions(-)\n create mode 100644 test\n"

ちゃんとコミットされたか確認

> system 'git log'
commit 90de0663fc7d0f15ef685a9106580c7a389122d8
Author: jugyo <jugyo.org@gmail.com>
Date:   Thu Oct 1 23:13:29 2009 +0900

    add test
=> true

ファイルの内容を取得してみる

> repo.commits.first.tree.contents.first.data
=> ""

うん。できてる。

Grit::Index を使うやりかた

Grit::Index を使うと、ファイルをいちいち作らなくてもインデックスにコンテンツを直接 add して commit してしまえる。

インデックスオブジェクトを取得

> index = repo.index
=> #<Grit::Index:0x130bf8c @tree={}, @current_tree=nil, @repo=#<Grit::Repo "/xxx/grit_test/.git">>

インデックスに foo という名前のファイル(中身は ‘this is foo’)を add

> index.add('foo', 'this is foo')
=> "this is foo"

それをコミット

> index.commit('add foo', [repo.commits.first.id])
=> "bd8fb763d7c7fc5db067b1c5348dfa6bfe2acbc4"

コミットする際、親となるコミットを指定しないと親のいないコミットを作ってしまうことになる

コミットできてるか確認

> system 'git log'
commit bd8fb763d7c7fc5db067b1c5348dfa6bfe2acbc4
Author: jugyo <jugyo.org@gmail.com>
Date:   Thu Oct 1 08:06:16 2009 -0700

    add foo

commit 7e72c5fe12e03bbf25e9dcbe315b7f8fa63e6e79
Author: jugyo <jugyo.org@gmail.com>
Date:   Fri Oct 2 00:04:51 2009 +0900

    add test
=> true

できてるできてる。

September 30, 2009

Grit についてざっくり調べてみた

Grit についてざっくり調べてみました(README 読んだだけだけど。。)。

Grit とは

http://github.com/mojombo/grit

Grit gives you object oriented read/write access to Git repositories via Ruby.
The main goals are stability and performance.

Grit を使うと Ruby からオブジェクト指向的に git リポジトリにアクセスできます。
安定性とパフォーマンスに主眼を置いています。
とのこと。

インストール

gem install grit

もしくは、

gem sources -a http://gems.github.com/
gem install mojombo-grit

README を見ながら irb で実験してみました。

Repo

以下のようにして初期化します。

> require 'grit'
> include Grit
> repo = Repo.new("./termtter")
=> #<Grit::Repo "/foo/bar/termtter/.git">

簡単ですね。

Commit

コミットのリストを取得してみます。

> repo.commits
=> [#<Grit::Commit "bc790bb863dd65d8bfe93de0c0cfc898e636ba4f">, #<Grit::Commit "2eb01622ce42b70b6d3783c0b38f1fdd0abff518">, ...]

うん。非常に簡単。

特定のブランチのコミットのリストを取得したりも当然できます。

> repo.commits('completion')
=> [#<Grit::Commit "bfc91876f8f351c5117b2f9d35a8e474bc78bf1a">, #<Grit::Commit "4f3235dabfe3e2138fe20c5530a568265d205c59">, ...]

以下のようにすればブランチのリストを取得することができます。

> repo.branches
=> [#<Grit::Head "completion">, #<Grit::Head "master">, #<Grit::Head "rb-readline">]

Tree

git では、ディレクトリ階層は tree と呼ばれるオブジェクトとして格納されます。
ファイルのデータにアクセスするには tree をたどっていきます。

以下のようにして HEAD のコミットが参照している tree からディレクトリ階層をたどれます。

> head = repo.commits.first
=> #<Grit::Commit "bc790bb863dd65d8bfe93de0c0cfc898e636ba4f">

> head.tree
=> #<Grit::Tree "c9d38d24de850cd3a84d64fd4f37724b1df8c606">

> head.tree.contents
=> [#<Grit::Blob "185df518579384e0fad605a152af021c2067fc0d">, ... #<Grit::Tree "10c07f6b2b6d874905c0273c7d7c4268e110295f">]

任意のディレクトリに対応する tree オブジェクトを取得するための以下のような便利メソッドがあります。

> head.tree / 'lib'
=> #<Grit::Tree "dd19474c13801cc034b687f2bfcb754a065d8dc5">

こりゃ便利。

Blob

git では、ファイルは blob というオブジェクトとして格納されます。
以下のようにして tree から blob を取得することができます。

> blob = head.tree / 'lib/termtter.rb'
=> #<Grit::Blob "02586fb2150de14c0dff3db0324a0df16ee4d66f">

ファイルの情報を取得するには以下のようにします。

> blob.name
=> "termtter.rb"

> blob.data
=> "# -*- coding: utf-8 -*-\n\n$KCODE = \"u\" unless Object.const_defined? :Encoding\n\n$:.unshift(File.dirname(__FILE__)) ...

で、これを何に使おうかなぁ。

August 25, 2009

読書: 「入門git」

入門git 入門git
でびあんぐる

オーム社 2009-08-12
売り上げランキング : 2359

Amazonで詳しく見る by G-Tools

これ読みましたー。
最近は日常的に git を使っててそこそこ詳しくなってたつもりだけど、基本をちゃんと抑えておくという意味でこれは読んで良かった。

久々にブログ書いてるので文章がうまく書けません。

git のインストール

えっと。
そうそう、git はソースから入れるのが一番いい気がした。

以下のようにするとドキュメントもインストールされていいらしい。

make prefix=/usr/local all doc
sudo make install install-doc

Mac の場合は以下のようにすると git-svn も入るしいい感じっすね。

sudo port install git-core +svn +doc

git diff

git diff はたぶん一日一万回くらい使ってるけど、このを本読むまで --cached オプションなんていう便利なオプションがあるのを知らなくてすごく損してたなーと思った。
git diff をオプション無しで実行すると、git によって管理されていてかつまだステージされてない(index に入っていない、つまり add してない)変更の差分が出力される。
git diff--cached オプションを付けて実行するとステージした変更と HEAD との差分を見ることができる。
今まではそういう差分を見るためにわざわざ git commit -v を使ったりしてた。
git diff には --stat なんてオプションもある(使ってないけど)。

git blame

そうそう、git blame を使えるようになりたいと思いつつも全然使ってない。
あ、普通に使う分には git blame README.rdoc とかやればいいのか。
そうすると以下のような感じでファイルのどの部分を誰が編集したのかとかがわりと簡単にわかる。

...
da557a52 (jugyo         2009-03-24 20:51:04 +0900  43)   % sudo gem install termtter
43752d7d (mattn         2009-01-08 14:13:28 +0900  44)
31e0dd9c (jugyo         2009-03-24 15:19:12 +0900  45) == CONFIGURATION:
a9a95484 (ujihisa       2009-01-06 18:43:43 +0900  46)
cd062ba3 (jugyo         2009-03-24 15:21:25 +0900  47) Termtter generates a configuration file named '~/.termtter/config'.
a9a95484 (ujihisa       2009-01-06 18:43:43 +0900  48) You can edit the file anytime.
d5ad26db (jugyo         2009-01-05 15:28:09 +0900  49)
da557a52 (jugyo         2009-03-24 20:51:04 +0900  50)   % vim ~/.termtter/config
...

行を指定する場合は以下にように -L オプションを使うのか。

git blame -L 10,20 README.rdoc

なるほどね。
さらに -L オプションには正規表現を指定できるらしい。

git blame -L"/def call_commands/",+10 lib/termtter/client.rb

これは便利だ。
git blame の出力に色が付いたらもうちょっとわかりやすいのにな。

git rebase -i

git rebase で個々のコミットをいじくり回すなんてことは今までやってなかったけど、この本読んで git rebase -i をやたら使うようになった(-i がポイント)。
git rebase -i は対話的に rebase を行うためのコマンドで、素晴らしく便利です(使い方は本書を読んで調べてください)。
僕はだいたい人間がやりそうなミスは一通りやってしまうたちなので、「あのコミットにこれも入れておけば良かったー」というような状況がしょっちゅうあって、そういう時に git rebase -i とか git commit --amend はとてもとても役に立ちますね。

branch と rebase について

branch と rebase について理解しないで git を使うのは結構つらいと思うけど、逆に考えるとそれらをだいたい理解していればたいていの場合はなんとかなる(はず)。

github T シャツについて

「入門git」とは全然関係ないんだけど、こないだ github T シャツを勝手に作った。

Picture 26

というわけで、今すぐ買うといいと思うよ!

入門git 入門git
でびあんぐる

オーム社 2009-08-12
売り上げランキング : 2359

Amazonで詳しく見る by G-Tools

July 20, 2009

TermtterKaigi 2009 が開催されました

RubyKaigi の会場の一角で TermtterKaigi 2009 が開催されました。

基調講演のリハーサルの様子。

2009-07-19 10.13.18.jpg

この写真なんですが、リハーサルというか、はじめ emasaka さんと僕の二人しかいなくて「全然人が集まらなかったらどうしよう」みたいな話をしていて、で、とりあえず基調講演をやったという記録だけでも残そうと思って撮影しました。
でも、11時くらいから意外と人が集まってかなり良い会議になったし基調講演もちゃんと行うことができました。
お集まりいただいた皆様ありがとうございました!

July 18, 2009

RejectKaigi で Termtter について発表してきました〜

今日は RubyKaigi 2日目でした。
夜のビアバッシュのときに RejectKaigi が開催されたのでそこで Termtter について発表してきました〜。

こういう形で発表するのは初めてだったのでかなり緊張しましたが、まあうまくいったんじゃないかなぁと思います。

July 15, 2009

Qik 便利かも

17513233-800c221b21c23693e059f0b0958a52d4.4a5dcf9b-scaled.jpg

Qik を使うと携帯で簡単に ust みたいなことができる。

http://qik.com/

何より気に入ったのが、サイトのデザイン。
こういうデザイン好き!

以下にサポートされている携帯電話の一覧がある。
http://qik.com/info/supported_phones

こないだゲットした GDD Phone で試してみた。
アプリのダウンロードは簡単で、GDD Phone のブラウザから http://d.qik.com にアクセスする。
で、インストール後に試しに撮ってみたのが以下。

GDD Phone の使い道ができて良かったです!

追記
GDD Phone を立たせてみた。

17514344-63cb229b7eee5fcfca129e2565580370.4a5dd2f6-scaled

これを使用してます。
http://www.amazon.co.jp/dp/4902756064

あと、そうだ、チャットで日本語が使えない。
ここは改善して欲しいところ。

July 11, 2009

本を捨てる

読まない本は捨てることにしました。
3分の1くらいは減るかな。