A areia não é mais mantida. Confira robusto.
Grit oferece acesso de leitura/gravação orientado a objetos aos repositórios Git via Ruby. Os principais objetivos são estabilidade e desempenho. Para esse fim, algumas das interações com os repositórios Git são feitas por meio do comando git
do sistema, e outras interações são feitas com reimplementações Ruby puras da funcionalidade principal do Git. Essa escolha, entretanto, é transparente para os usuários finais e você não precisa saber qual método está sendo usado.
Este software foi desenvolvido para alimentar o GitHub e deve ser considerado pronto para produção. Um extenso conjunto de testes é fornecido para verificar sua correção.
Grit é mantido por Tom Preston-Werner, Scott Chacon, Chris Wanstrath e PJ Hyett.
Esta documentação é precisa a partir do Grit 2.3.
A instalação mais fácil é via RubyGems:
$ gem install grit
O repositório Git do Grit está disponível no GitHub, que pode ser navegado em:
http://github.com/mojombo/grit
e clonado com:
git clone git://github.com/mojombo/grit.git
Você precisará destas joias para passar nos testes:
Se você quiser hackear o Grit, siga estas instruções. Para obter todas as dependências, instale a gem primeiro.
rake
O Grit oferece acesso de modelo de objeto aos seus repositórios Git. Depois de criar um objeto Repo
, você pode percorrê-lo para encontrar commits pais, árvores, blobs, etc.
O primeiro passo é criar um objeto Grit::Repo
para representar seu repo. Nesta documentação incluo o módulo Grit
para reduzir a digitação.
require 'grit'
repo = Grit::Repo.new("/Users/tom/dev/grit")
No exemplo acima, o diretório /Users/tom/dev/grit
é meu diretório de trabalho e contém o diretório .git
. Você também pode inicializar o Grit com um repositório simples.
repo = Repo.new("/var/git/grit.git")
No objeto Repo
, você pode obter uma lista de commits como uma matriz de objetos Commit
.
repo.commits
# => [#<Grit::Commit "e80bbd2ce67651aa18e57fb0b43618ad4baf7750">,
#<Grit::Commit "91169e1f5fa4de2eaea3f176461f5dc784796769">,
#<Grit::Commit "038af8c329ef7c1bae4568b98bd5c58510465493">,
#<Grit::Commit "40d3057d09a7a4d61059bca9dca5ae698de58cbe">,
#<Grit::Commit "4ea50f4754937bf19461af58ce3b3d24c77311d9">]
Chamado sem argumentos, Repo#commits
retorna uma lista de até dez commits acessíveis pelo branch master (começando pelo commit mais recente). Você pode solicitar commits começando em um branch, commit, tag diferente, etc.
repo.commits('mybranch')
repo.commits('40d3057d09a7a4d61059bca9dca5ae698de58cbe')
repo.commits('v0.1')
Você pode especificar o número máximo de commits a serem retornados.
repo.commits('master', 100)
Se precisar de paginação, você pode especificar um número de commits para ignorar.
repo.commits('master', 10, 20)
O texto acima retornará os commits 21-30 da lista de commits.
Os objetos Commit
contêm informações sobre esse 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"
Você pode percorrer a ancestralidade de um commit encadeando chamadas para #parents
.
repo.commits.first.parents[0].parents[0].parents[0]
O acima corresponde a master^^^ ou master~3 na linguagem Git.
Uma árvore registra ponteiros para o conteúdo de um diretório. Digamos que você queira a árvore raiz do commit mais recente no branch master .
tree = repo.commits.first.tree
# => #<Grit::Tree "3536eb9abac69c3e4db583ad38f3d30f8db4771f">
tree.id
# => "3536eb9abac69c3e4db583ad38f3d30f8db4771f"
Depois de ter uma árvore, você pode obter o conteúdo.
contents = tree.contents
# => [#<Grit::Blob "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666">,
#<Grit::Blob "81d2c27608b352814cbe979a6acd678d30219678">,
#<Grit::Tree "c3d07b0083f01a6e1ac969a0f32b8d06f20c62e5">,
#<Grit::Tree "4d00fe177a8407dbbc64a24dbfc564762c0922d8">]
Esta árvore contém dois objetos Blob
e dois objetos Tree
. As árvores são subdiretórios e os blobs são arquivos. As árvores abaixo da raiz possuem atributos adicionais.
contents.last.name
# => "lib"
contents.last.mode
# => "040000"
Existe um método conveniente que permite obter um subobjeto nomeado de uma árvore.
tree / "lib"
# => #<Grit::Tree "e74893a3d8a25cbb1367cf241cc741bfd503c4b2">
Você também pode obter uma árvore diretamente do repositório se souber seu nome.
repo.tree
# => #<Grit::Tree "master">
repo.tree("91169e1f5fa4de2eaea3f176461f5dc784796769")
# => #<Grit::Tree "91169e1f5fa4de2eaea3f176461f5dc784796769">
Um blob representa um arquivo. As árvores geralmente contêm bolhas.
blob = tree.contents.first
# => #<Grit::Blob "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666">
Um blob possui certos atributos.
blob.id
# => "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666"
blob.name
# => "README.txt"
blob.mode
# => "100644"
blob.size
# => 7726
Você pode obter os dados de um blob como uma string.
blob.data
# => "Grit is a library to ..."
Você também pode obter um blob diretamente do repositório se souber seu nome.
repo.blob("4ebc8aea50e0a67e000ba29a30809d0a7b9b2666")
# => #<Grit::Blob "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666">
Existem muitos outros métodos de API disponíveis que não estão documentados aqui. Consulte o código para obter mais funcionalidades.
Direitos autorais (c) 2010 Tom Preston-Werner. Consulte LICENÇA para obter detalhes.