La arena ya no se mantiene. Mira lo resistente.
Grit le brinda acceso de lectura/escritura orientado a objetos a los repositorios de Git a través de Ruby. Los principales objetivos son la estabilidad y el rendimiento. Con este fin, algunas de las interacciones con los repositorios de Git se realizan mediante el uso del comando git
del sistema, y otras interacciones se realizan con reimplementaciones puras de Ruby de la funcionalidad principal de Git. Sin embargo, esta elección es transparente para los usuarios finales y no es necesario saber qué método se está utilizando.
Este software fue desarrollado para impulsar GitHub y debe considerarse listo para producción. Se proporciona un amplio conjunto de pruebas para verificar su exactitud.
Grit está a cargo de Tom Preston-Werner, Scott Chacon, Chris Wanstrath y PJ Hyett.
Esta documentación es precisa a partir de Grit 2.3.
La instalación más sencilla es a través de RubyGems:
$ gem install grit
El repositorio Git de Grit está disponible en GitHub, y se puede consultar en:
http://github.com/mojombo/grit
y clonado con:
git clone git://github.com/mojombo/grit.git
Necesitará estas gemas para aprobar las pruebas:
Si desea piratear Grit, siga estas instrucciones. Para obtener todas las dependencias, primero instale la gema.
rake
Grit le brinda acceso al modelo de objetos a sus repositorios de Git. Una vez que haya creado un objeto Repo
, puede recorrerlo para encontrar confirmaciones principales, árboles, blobs, etc.
El primer paso es crear un objeto Grit::Repo
para representar su repositorio. En esta documentación incluyo el módulo Grit
para reducir la escritura.
require 'grit'
repo = Grit::Repo.new("/Users/tom/dev/grit")
En el ejemplo anterior, el directorio /Users/tom/dev/grit
es mi directorio de trabajo y contiene el directorio .git
. También puedes inicializar Grit con un repositorio simple.
repo = Repo.new("/var/git/grit.git")
Desde el objeto Repo
, puede obtener una lista de confirmaciones como una matriz de objetos Commit
.
repo.commits
# => [#<Grit::Commit "e80bbd2ce67651aa18e57fb0b43618ad4baf7750">,
#<Grit::Commit "91169e1f5fa4de2eaea3f176461f5dc784796769">,
#<Grit::Commit "038af8c329ef7c1bae4568b98bd5c58510465493">,
#<Grit::Commit "40d3057d09a7a4d61059bca9dca5ae698de58cbe">,
#<Grit::Commit "4ea50f4754937bf19461af58ce3b3d24c77311d9">]
Llamado sin argumentos, Repo#commits
devuelve una lista de hasta diez confirmaciones a las que puede acceder la rama maestra (comenzando por la última confirmación). Puede solicitar confirmaciones que comiencen en una rama, confirmación, etiqueta, etc. diferente.
repo.commits('mybranch')
repo.commits('40d3057d09a7a4d61059bca9dca5ae698de58cbe')
repo.commits('v0.1')
Puede especificar el número máximo de confirmaciones que se devolverán.
repo.commits('master', 100)
Si necesita paginación, puede especificar una cantidad de confirmaciones para omitir.
repo.commits('master', 10, 20)
Lo anterior devolverá las confirmaciones 21-30 de la lista de confirmaciones.
Los objetos Commit
contienen información sobre esa confirmación.
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"
Puedes recorrer la ascendencia de una confirmación encadenando llamadas a #parents
.
repo.commits.first.parents[0].parents[0].parents[0]
Lo anterior corresponde a master^^^ o master~3 en el lenguaje Git.
Un árbol registra punteros al contenido de un directorio. Digamos que desea el árbol raíz de la última confirmación en la rama maestra .
tree = repo.commits.first.tree
# => #<Grit::Tree "3536eb9abac69c3e4db583ad38f3d30f8db4771f">
tree.id
# => "3536eb9abac69c3e4db583ad38f3d30f8db4771f"
Una vez que tengas un árbol, podrás obtener el contenido.
contents = tree.contents
# => [#<Grit::Blob "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666">,
#<Grit::Blob "81d2c27608b352814cbe979a6acd678d30219678">,
#<Grit::Tree "c3d07b0083f01a6e1ac969a0f32b8d06f20c62e5">,
#<Grit::Tree "4d00fe177a8407dbbc64a24dbfc564762c0922d8">]
Este árbol contiene dos objetos Blob
y dos objetos Tree
. Los árboles son subdirectorios y los blobs son archivos. Los árboles debajo de la raíz tienen atributos adicionales.
contents.last.name
# => "lib"
contents.last.mode
# => "040000"
Existe un método conveniente que le permite obtener un subobjeto con nombre de un árbol.
tree / "lib"
# => #<Grit::Tree "e74893a3d8a25cbb1367cf241cc741bfd503c4b2">
También puedes obtener un árbol directamente desde el repositorio si conoces su nombre.
repo.tree
# => #<Grit::Tree "master">
repo.tree("91169e1f5fa4de2eaea3f176461f5dc784796769")
# => #<Grit::Tree "91169e1f5fa4de2eaea3f176461f5dc784796769">
Un blob representa un archivo. Los árboles suelen contener manchas.
blob = tree.contents.first
# => #<Grit::Blob "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666">
Un blob tiene ciertos atributos.
blob.id
# => "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666"
blob.name
# => "README.txt"
blob.mode
# => "100644"
blob.size
# => 7726
Puede obtener los datos de un blob como una cadena.
blob.data
# => "Grit is a library to ..."
También puede obtener un blob directamente desde el repositorio si conoce su nombre.
repo.blob("4ebc8aea50e0a67e000ba29a30809d0a7b9b2666")
# => #<Grit::Blob "4ebc8aea50e0a67e000ba29a30809d0a7b9b2666">
Hay muchos más métodos API disponibles que no están documentados aquí. Consulte el código para obtener más funciones.
Copyright (c) 2010 Tom Preston-Werner. Consulte LICENCIA para obtener más detalles.