Crear gráfico de un repository de GIT

¿Cómo podría get la información necesaria para crear charts adjuntos en esta publicación que esencialmente me daría la siguiente información visual … IDENTIFICACIÓN DEL COMPROMISO -> IDENTIFICACIÓN DEL ÁRBOL -> BLOBOS

GIT Graph Img 1

Aqui hay otro más..

Img 2

Hay dos partes en este problema. Una es muy fácil: sacar los bordes y vértices del gráfico de Git. El otro es muy difícil: dibujar un diagtwig "bonito" (plano, con cruces mínimos de línea).

Parece que estás preguntando sobre la parte fácil, así que aquí está la respuesta: usa git cat-file -p para get el contenido de cada object Git, comenzando con alguna ID o ID de hash conocida de Git. (Utilice git rev-parse para get los ID iniciales).

Por ejemplo:

 $ git rev-parse HEAD d35688db19c9ea97e9e2ce751dc7b47aee21636b $ git cat-file -p HEAD tree 242af4b1a902347da2ff144516fb40c4a28ca257 parent 43c9e7e365d7a8961767d0bd4a305ca378800a2a author Junio C Hamano <gitster@pobox.com> 1507361343 +0900 committer Junio C Hamano <gitster@pobox.com> 1507361343 +0900 Prepare for -rc1 Signed-off-by: Junio C Hamano <gitster@pobox.com> 

(El ejemplo de git cat-file aquí está destinado a mostrar que puede usar un nombre simbólico, o un ID de hash, para iniciar el process). Al examinar un object de confirmación obtendremos exactamente una línea de tree y cero o más líneas parent , proporcionando los identificadores hash para los bordes parentales (tenga en count que se trata de un DAG y estos son arcos salientes, si desea dibujar flechas en los bordes )

Un object de tree tiene una forma interna relativamente rígida, que de nuevo se puede ver a través de git cat-file -p :

 $ git cat-file -p 242af4b1a902347da2ff144516fb40c4a28ca257 100644 blob 611ab4750bd21e77d0fec41c8b2e115574c692ff .clang-format 100644 blob 8ce9c6b8888fe6c12949d30e3e8b461cb67bb43f .gitattributes 040000 tree 7ba15927519648dbc42b15e61739cbf5aeebf48b .github 100644 blob 833ef3b0b783b8180d0dad1ce336713bddf09b26 .gitignore 100644 blob cbeebdab7a5e2c6afec338c3534930f569c90f63 .gitmodules 100644 blob ab85e0d16d6383b13954220a0b41202bd68d5d73 .mailmap 100644 blob fead995eddd15460b6be81e6a5f7c8f0648368ca .travis.yml 100644 blob 8c85014a0a936892f6832c68e3db646b6f9d2ea2 .tsan-suppressions 100644 blob 536e55524db72bd2acf175208aef4f3dfc148d42 COPYING 040000 tree 3957dfa63966e1efd20481ebd61311397a34e8ab Documentation 100755 blob ab04c977be0cfdb6f282b7911d3fe630d5f70c65 GIT-VERSION-GEN 100644 blob ffb071e9f03a79a052beaa4372fa790ecbabbb7b INSTALL [more, snipped] 

Cada línea de salida comienza con un "modo", que es 040000 si el object con este nombre es en sí mismo otro tree, o uno de 100644 o 100755 si se trata de un file ordinario. (Hay dos modos más, uno para enlaces simbólicos, y otro para un "gitlink", que es cómo Git almacena la ID del hash del submodule para los submodules. Consulte también https://github.com/chris3torek/scripts/blob/master/ githash.py, por ejemplo.) Siguiendo el modo codificado, git cat-file -p imprime el tipo de object Git subyacente, luego el ID de hash, luego una pestaña y luego el componente de nombre de file bajo el cual se encuentra el blob o subtree ser extraído

Cada ID de hash es única, por lo que si se produce una ID de hash más de una vez, tiene un subnodo compartido. Este es el caso de varios de los objects blob en sus charts de ejemplo. Tenga en count que también se puede reutilizar un tree de nivel superior. Por ejemplo, si tienes esta serie de commits:

 A <-B <-C <--master 

donde el compromiso C está hecho por un git revert del compromiso B , es muy probable que A y C usen el mismo tree de nivel superior (lo que automáticamente significa que usan todos los mismos subtreees y blobs).

    Intereting Posts