Le grain n'est plus maintenu. Découvrez robuste.
Grit vous donne un accès en lecture/écriture orienté objet aux référentiels Git via Ruby. Les principaux objectifs sont la stabilité et la performance. À cette fin, certaines des interactions avec les référentiels Git sont effectuées en utilisant la commande git
du système, et d'autres interactions sont effectuées avec des réimplémentations Ruby pures des fonctionnalités de base de Git. Ce choix est toutefois transparent pour les utilisateurs finaux et vous n’avez pas besoin de savoir quelle méthode est utilisée.
Ce logiciel a été développé pour alimenter GitHub et doit être considéré comme prêt pour la production. Une suite de tests complète est fournie pour vérifier son exactitude.
Grit est maintenu par Tom Preston-Werner, Scott Chacon, Chris Wanstrath et PJ Hyett.
Cette documentation est exacte à partir de Grit 2.3.
L'installation la plus simple se fait via RubyGems :
$ gem install grit
Le dépôt Git de Grit est disponible sur GitHub, qui peut être consulté à l'adresse :
http://github.com/mojombo/grit
et cloné avec :
git clone git://github.com/mojombo/grit.git
Vous aurez besoin de ces gemmes pour réussir les tests :
Si vous souhaitez pirater Grit, suivez ces instructions. Pour obtenir toutes les dépendances, installez d'abord la gemme.
rake
Grit vous donne un accès par modèle objet à vos référentiels Git. Une fois que vous avez créé un objet Repo
, vous pouvez le parcourir pour trouver des commits parents, des arbres, des blobs, etc.
La première étape consiste à créer un objet Grit::Repo
pour représenter votre dépôt. Dans cette documentation, j'inclus le module Grit
pour réduire la saisie.
require 'grit'
repo = Grit::Repo.new("/Users/tom/dev/grit")
Dans l'exemple ci-dessus, le répertoire /Users/tom/dev/grit
est mon répertoire de travail et contient le répertoire .git
. Vous pouvez également initialiser Grit avec un dépôt nu.
repo = Repo.new("/var/git/grit.git")
À partir de l'objet Repo
, vous pouvez obtenir une liste de validations sous forme de tableau d'objets Commit
.
repo.commits
# => [#<Grit::Commit "e80bbd2ce67651aa18e57fb0b43618ad4baf7750">,
#<Grit::Commit "91169e1f5fa4de2eaea3f176461f5dc784796769">,
#<Grit::Commit "038af8c329ef7c1bae4568b98bd5c58510465493">,
#<Grit::Commit "40d3057d09a7a4d61059bca9dca5ae698de58cbe">,
#<Grit::Commit "4ea50f4754937bf19461af58ce3b3d24c77311d9">]
Appelé sans arguments, Repo#commits
renvoie une liste de dix commits maximum accessibles par la branche master (en commençant par le dernier commit). Vous pouvez demander des commits commençant dans une branche, un commit, une balise différente, etc.
repo.commits('mybranch')
repo.commits('40d3057d09a7a4d61059bca9dca5ae698de58cbe')
repo.commits('v0.1')
Vous pouvez spécifier le nombre maximum de commits à renvoyer.
repo.commits('master', 100)
Si vous avez besoin d'une pagination, vous pouvez spécifier un certain nombre de validations à ignorer.
repo.commits('master', 10, 20)
Ce qui précède renverra les commits 21 à 30 de la liste des commits.
Les objets Commit
contiennent des informations sur cette validation.
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"
Vous pouvez parcourir l'ascendance d'un commit en enchaînant les appels à #parents
.
repo.commits.first.parents[0].parents[0].parents[0]
Ce qui précède correspond à master^^^ ou master~3 dans le langage Git.
Une arborescence enregistre des pointeurs vers le contenu d'un répertoire. Disons que vous voulez l'arborescence racine du dernier commit sur la branche master .
tree = repo.commits.first.tree
# => #<Grit::Tree "3536eb9abac69c3e4db583ad38f3d30f8db4771f">
tree.id
# => "3536eb9abac69c3e4db583ad38f3d30f8db4771f"
Une fois que vous avez un arbre, vous pouvez en récupérer le contenu.
contents = tree.contents
# => [#<Grit::Blob "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666">,
#<Grit::Blob "81d2c27608b352814cbe979a6acd678d30219678">,
#<Grit::Tree "c3d07b0083f01a6e1ac969a0f32b8d06f20c62e5">,
#<Grit::Tree "4d00fe177a8407dbbc64a24dbfc564762c0922d8">]
Cette arborescence contient deux objets Blob
et deux objets Tree
. Les arborescences sont des sous-répertoires et les blobs sont des fichiers. Les arbres situés sous la racine ont des attributs supplémentaires.
contents.last.name
# => "lib"
contents.last.mode
# => "040000"
Il existe une méthode pratique qui vous permet d'obtenir un sous-objet nommé à partir d'une arborescence.
tree / "lib"
# => #<Grit::Tree "e74893a3d8a25cbb1367cf241cc741bfd503c4b2">
Vous pouvez également obtenir un arbre directement depuis le dépôt si vous connaissez son nom.
repo.tree
# => #<Grit::Tree "master">
repo.tree("91169e1f5fa4de2eaea3f176461f5dc784796769")
# => #<Grit::Tree "91169e1f5fa4de2eaea3f176461f5dc784796769">
Un blob représente un fichier. Les arbres contiennent souvent des blobs.
blob = tree.contents.first
# => #<Grit::Blob "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666">
Un blob possède certains attributs.
blob.id
# => "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666"
blob.name
# => "README.txt"
blob.mode
# => "100644"
blob.size
# => 7726
Vous pouvez obtenir les données d'un blob sous forme de chaîne.
blob.data
# => "Grit is a library to ..."
Vous pouvez également obtenir un blob directement depuis le dépôt si vous connaissez son nom.
repo.blob("4ebc8aea50e0a67e000ba29a30809d0a7b9b2666")
# => #<Grit::Blob "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666">
Il existe de nombreuses autres méthodes API disponibles qui ne sont pas documentées ici. Veuillez référencer le code pour plus de fonctionnalités.
Copyright (c) 2010 Tom Preston-Werner. Voir LICENCE pour plus de détails.