グリットは維持されなくなりました。頑丈さをチェックしてください。
Grit を使用すると、Ruby 経由で Git リポジトリへのオブジェクト指向の読み取り/書き込みアクセスが可能になります。主な目標は安定性とパフォーマンスです。この目的を達成するために、Git リポジトリとの対話の一部はシステムのgit
コマンドにシェルアウトすることによって行われ、その他の対話はコア Git 機能の純粋な Ruby 再実装によって行われます。ただし、この選択はエンド ユーザーには透過的であるため、どの方法が使用されているかを知る必要はありません。
このソフトウェアは GitHub を強化するために開発されたものであり、本番環境に対応していると見なされます。その正確性を検証するために、広範なテストスイートが提供されています。
Grit は、Tom Preston-Werner、Scott Chacon、Chris Wanstrath、PJ Hyett によって維持されています。
このドキュメントは Grit 2.3 時点で正確です。
最も簡単なインストールは RubyGems 経由です。
$ gem install grit
Grit の Git リポジトリは GitHub で入手でき、次の場所で参照できます。
http://github.com/mojombo/grit
そして以下を使用してクローンを作成しました:
git clone git://github.com/mojombo/grit.git
テストに合格するには、次の gem が必要です。
Grit をハックしたい場合は、次の手順に従ってください。すべての依存関係を取得するには、最初に gem をインストールします。
rake
実行してすべてが合格することを確認しますGrit を使用すると、オブジェクト モデルが Git リポジトリにアクセスできるようになります。 Repo
オブジェクトを作成したら、それを走査して親コミット、ツリー、BLOB などを見つけることができます。
最初のステップは、リポジトリを表すGrit::Repo
オブジェクトを作成することです。このドキュメントでは、入力を減らすためにGrit
モジュールを含めています。
require 'grit'
repo = Grit::Repo.new("/Users/tom/dev/grit")
上の例では、ディレクトリ/Users/tom/dev/grit
作業ディレクトリであり、 .git
ディレクトリが含まれています。裸のリポジトリを使用して Grit を初期化することもできます。
repo = Repo.new("/var/git/grit.git")
Repo
オブジェクトから、コミットのリストをCommit
オブジェクトの配列として取得できます。
repo.commits
# => [#<Grit::Commit "e80bbd2ce67651aa18e57fb0b43618ad4baf7750">,
#<Grit::Commit "91169e1f5fa4de2eaea3f176461f5dc784796769">,
#<Grit::Commit "038af8c329ef7c1bae4568b98bd5c58510465493">,
#<Grit::Commit "40d3057d09a7a4d61059bca9dca5ae698de58cbe">,
#<Grit::Commit "4ea50f4754937bf19461af58ce3b3d24c77311d9">]
引数なしで呼び出されたRepo#commits
、 masterブランチが到達可能な最大 10 個のコミットのリスト (最新のコミットから開始) を返します。別のブランチ、コミット、タグなどから始まるコミットを要求できます。
repo.commits('mybranch')
repo.commits('40d3057d09a7a4d61059bca9dca5ae698de58cbe')
repo.commits('v0.1')
返されるコミットの最大数を指定できます。
repo.commits('master', 100)
ページングが必要な場合は、スキップするコミットの数を指定できます。
repo.commits('master', 10, 20)
上記はコミット リストからコミット 21 ~ 30 を返します。
Commit
オブジェクトには、そのコミットに関する情報が含まれています。
head = repo.commits.first
head.id
# => "e80bbd2ce67651aa18e57fb0b43618ad4baf7750"
head.parents
# => [#<Grit::Commit "91169e1f5fa4de2eaea3f176461f5dc784796769">]
head.tree
# => #<Grit::Tree "3536eb9abac69c3e4db583ad38f3d30f8db4771f">
head.author
# => #<Grit::Actor "Tom Preston-Werner <[email protected]>">
head.authored_date
# => Wed Oct 24 22:02:31 -0700 2007
head.committer
# => #<Grit::Actor "Tom Preston-Werner <[email protected]>">
head.committed_date
# => Wed Oct 24 22:02:31 -0700 2007
head.message
# => "add Actor inspect"
#parents
への呼び出しを連鎖させることで、コミットの祖先をたどることができます。
repo.commits.first.parents[0].parents[0].parents[0]
上記は、Git 用語のmaster^^^またはmaster~3に相当します。
ツリーには、ディレクトリの内容へのポインタが記録されます。 masterブランチ上の最新のコミットのルート ツリーが必要だとします。
tree = repo.commits.first.tree
# => #<Grit::Tree "3536eb9abac69c3e4db583ad38f3d30f8db4771f">
tree.id
# => "3536eb9abac69c3e4db583ad38f3d30f8db4771f"
ツリーを作成したら、コンテンツを取得できます。
contents = tree.contents
# => [#<Grit::Blob "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666">,
#<Grit::Blob "81d2c27608b352814cbe979a6acd678d30219678">,
#<Grit::Tree "c3d07b0083f01a6e1ac969a0f32b8d06f20c62e5">,
#<Grit::Tree "4d00fe177a8407dbbc64a24dbfc564762c0922d8">]
このツリーには、2 つのBlob
オブジェクトと 2 つのTree
オブジェクトが含まれています。ツリーはサブディレクトリであり、BLOB はファイルです。ルートの下のツリーには追加の属性があります。
contents.last.name
# => "lib"
contents.last.mode
# => "040000"
ツリーから名前付きサブオブジェクトを取得できる便利なメソッドがあります。
tree / "lib"
# => #<Grit::Tree "e74893a3d8a25cbb1367cf241cc741bfd503c4b2">
名前がわかっている場合は、リポジトリから直接ツリーを取得することもできます。
repo.tree
# => #<Grit::Tree "master">
repo.tree("91169e1f5fa4de2eaea3f176461f5dc784796769")
# => #<Grit::Tree "91169e1f5fa4de2eaea3f176461f5dc784796769">
BLOB はファイルを表します。木には塊が含まれることがよくあります。
blob = tree.contents.first
# => #<Grit::Blob "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666">
BLOB には特定の属性があります。
blob.id
# => "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666"
blob.name
# => "README.txt"
blob.mode
# => "100644"
blob.size
# => 7726
BLOB のデータを文字列として取得できます。
blob.data
# => "Grit is a library to ..."
BLOB の名前がわかっている場合は、リポジトリから直接 BLOB を取得することもできます。
repo.blob("4ebc8aea50e0a67e000ba29a30809d0a7b9b2666")
# => #<Grit::Blob "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666">
ここでは説明しませんが、利用可能な API メソッドが他にもたくさんあります。詳しい機能についてはコードを参照してください。
著作権 (c) 2010 トム プレストン ワーナー。詳細については、「ライセンス」を参照してください。