Obtener un blob de una confirmación?

Estoy intentando descubrir cómo podría get una list de files y sus respectivos blobs antiguos y nuevos para una única confirmación.

Digamos que has commit 1 que cambió 3 files. Me gustaría ejecutar dicha function y devolver 3 files junto con su viejo blob y blob nuevo (suponiendo que no son binarys).

¿Sería la única manera de hacer esto get la confirmación y la confirmación previa, resolver sus treees, luego hacer una diferencia en los treees para descubrir qué es diferente y luego get la burbuja para cada file diferente?

¿Sería la única manera de hacer esto get la confirmación y la confirmación previa, resolver sus treees, luego hacer una diferencia en los treees para descubrir qué es diferente y luego get la burbuja para cada file diferente?

Sí, esta es la forma recomendada. Las inputs "antiguas" y "nuevas" son solo conceptos que tienen sentido cuando se comparan dos Tree .

Tenga en count que "viejo" y "nuevo" no son calificativos expresivos. Como se puede ver en el encabezado diff , el estado diferido resultante de una input puede ser

  • GIT_DELTA_UNMODIFIED = 0, / ** sin cambios * /
  • GIT_DELTA_ADDED = 1, / ** la input no existe en la versión anterior * /
  • GIT_DELTA_DELETED = 2, / ** la input no existe en la nueva versión * /
  • GIT_DELTA_MODIFIED = 3, / ** el contenido de la input cambió entre antiguo y nuevo * /
  • GIT_DELTA_RENAMED = 4, / ** la input se renombró entre vieja y nueva * /
  • GIT_DELTA_COPIED = 5, / ** input fue copyda de otra input anterior * /
  • GIT_DELTA_IGNORED = 6, / ** la input es elemento ignorado en workdir * /
  • GIT_DELTA_UNTRACKED = 7, / ** entry es un elemento sin seguimiento en workdir * /
  • GIT_DELTA_TYPECHANGE = 8, / ** tipo de input cambiada entre antigua y nueva * /

El file de testing libgit2 tests-clar / diff / tree debería darle algún uso de muestra de esta característica.

Actualizar:

Una pregunta similar (de usted? ;-)) se ha planteado en el rastreador de problemas libgit2. La respuesta de @arrbee también se basa en aprovechar la git_diff_tree_to_tree() API .

Extracción de SHA1 para revisiones anteriores y actuales

Considere la salida de git show --raw v1.8.1^0 en el propio repository de git.

  cometer 5d417842efeafb6e109db7574196901c4e95d273
 Autor: Junio ​​C Hamano 
 Fecha: lun 31 dic 14:24:22 2012 -0800

     Git 1.8.1

     Firmado por: Junio ​​C Hamano <gitster@pobox.com>

 : 100644 100644 fec1a06 ... d6f9555 ... M Documentation / RelNotes / 1.8.1.txt
 : 100644 100644 b0e8f02 ... 7a3f03b ... M Documentation / git.txt
 : 100755 100755 b2dffc8 ... 72e37c9 ... M GIT-VERSION-GEN 

Las últimas tres líneas indican los files que han cambiado con esa confirmación. El primer SHA1 en una línea de cambio es el nombre del object de la revisión anterior de un file dado, y el segundo es el blob en la confirmación nombrada. Por ejemplo, GIT-VERSION-GEN en v1.8.1 hash para

  $ git show v1.8.1 ^ 0: GIT-VERSION-GEN |  git hash-object --stdin
 72e37c9bfe3e897635f8c211569d9e6f5658a980 

y el blob asociado con su compromiso principal es

  $ git show v1.8.1 ^ 0 ~: GIT-VERSION-GEN |  git hash-object --stdin
 b2dffc839f306123d544e8f536ee31a7574f1139 

Nota: la documentation de git rev-parse explica

Como regla especial, <rev>^0 significa el compromiso en sí y se usa cuando <rev> es el nombre del object de un object de label que hace reference a un object de confirmación.

En este caso, v1.8.1^0 significa el compromiso al que se refiere la label v1.8.1 .

Obteniendo SHA1s para todos los blobs en un commit

Para get nombres de objects para todos los blobs asociados con una confirmación dada, lea la salida de git ls-tree , que se asemeja a

  $ git ls-tree -r v1.8.1 ^ 0
 100644 blob 5e98806c6cc246acef5f539ae191710a0c06ad3f .gitattributes
 100644 blob f702415c12c5a4a66180f7ffd697347e5343ac4a .gitignore
 100644 blob c7e86183001a00ad2105765708b5b59852ef6640 .mailmap
 100644 blob 536e55524db72bd2acf175208aef4f3dfc148d42 COPYING
 100644 blob ddb030137d54ef3fb0ee01d973ec5cee4bb2b2b3 Documentation / .gitattributes
 100644 blob d62aebd848b2a44f977ad4d7c4b75b6ff72b2163 Documentation / .gitignore
 100644 blob 69f7e9b76c3f9b87b7951fb0df6a9720edadeb3e Documentation / CodingGuidelines
 100644 blob e53d333e5c08515af1e21d81c7daa365b12609a1 Documentación / Makefile
 100644 blob fea3f9935b7794ce86f04d22c9d68fb9d537167d Documentación / RelNotes / 1.5.0.1.txt
 100644 blob b061e50ff05b5e13211bb315e240974e898de32c Documentation / RelNotes / 1.5.0.2.txt
 ... 

Usando solo los commands de Git, no se conoce acerca de las funciones de libgit2 particulares para acceder a esta información, pero probablemente pueda darse count de eso.

Puede get una list de files de los files que han cambiado en una determinada confirmación utilizando git show --stat COMMIT . En la parte inferior hay una list de routes de files que han cambiado (más detalles cuántas líneas han cambiado). Probablemente puedas filtrar las cosas desde allí. Puede seguir utilizando el formatting bonito para eliminar aún más contenido de la salida.

Una vez que tenga la ruta del file, puede get un blob de file usando git show COMMIT:PATH . Obtienes la versión anterior del file usando git show COMMIT^:PATH .