从 GIT 存储库创建图表

Create graph from a GIT repo

我怎样才能获得必要的信息来创建附加在这个 post 中的图表,这些图表基本上会给我以下视觉效果.. 提交 ID -> 树 ID -> BLOBS

这是另一个..

这个问题有两个部分。一个非常简单:从 Git 中获取图的边和顶点。另一个非常难:绘制 "pretty"(平面,具有最少的线交叉)图。

您似乎问的是简单的部分,所以答案如下:使用 git cat-file -p 获取每个 Git 对象的内容,从一些已知的 Git 哈希 ID 开始或身份证。 (使用 git rev-parse 获取初始 ID。)

例如:

$ 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>

(此处的 git cat-file 示例旨在表明您可以使用 或者 符号名称, 哈希ID,以启动流程)。检查提交对象将得到一个 tree 行和零个或多个 parent 行,提供父边的哈希 ID(请注意,这是一个 DAG,这些是传出弧,如果你注意在边缘画箭头)。

一个tree对象有一个相对严格的内部形式,同样可以通过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]

每个输出行都以 "mode" 开头,如果具有此名称的对象本身是另一棵树,则为 040000,或者 100644100755 之一,如果它是一个普通文件。 (还有两种模式,一种用于符号链接,一种用于 "gitlink",这就是 Git 存储子模块的子模块哈希 ID 的方式。另请参阅 https://github.com/chris3torek/scripts/blob/master/githash.py 示例。)编码模式,git cat-file -p 打印底层 Git 对象类型,然后是哈希 ID,然后是制表符,然后是要提取 blob 或子树的文件名组件。

每个散列 ID 都是唯一的,因此如果一个散列 ID 多次出现,则您有一个共享子节点。示例图中的几个 blob 对象就是这种情况。请注意,顶级树也可以重复使用。例如,如果你有这个提交系列:

A <-B <-C   <--master

其中提交 C 是由提交 Bgit revert 完成的,很可能 AC 使用相同的 top-级别树(这自动意味着它们使用所有相同的子树和斑点)。