2017-10-07 118 views
0

我怎麼能獲得必要的信息來創建連接在這個崗位圖形,將基本上給我下面的視覺.. 提交ID - >樹ID - >斑點從GIT回購創建圖表

GIT Graph Img 1

這裏是另一個..

Img 2

+0

這取決於你想要繪製什麼。 – pvg

+0

基本上所附的圖像顯示。 COMMIT ID - > TREE ID - > BLOB/TREE's –

+0

編輯您的問題以添加該信息,但如果您知道自己想要繪製的圖形,則不完全清楚您要求的內容。如何從git中獲取數據? – pvg

回答

2

有兩個部分解決這個問題。一個非常簡單:從Git中獲取圖形邊緣和頂點。另一個非常困難:繪製一個「漂亮」(平面,最小線交叉)圖。

您似乎在問一些簡單的部分,所以這裏是答案:使用git cat-file -p來獲取每個Git對象的內容,從一些已知的Git哈希ID或ID開始。 (使用git rev-parse以獲得初始的ID。)

例如:

$ git rev-parse HEAD 
d35688db19c9ea97e9e2ce751dc7b47aee21636b 
$ git cat-file -p HEAD 
tree 242af4b1a902347da2ff144516fb40c4a28ca257 
parent 43c9e7e365d7a8961767d0bd4a305ca378800a2a 
author Junio C Hamano <[email protected]> 1507361343 +0900 
committer Junio C Hamano <[email protected]> 1507361343 +0900 

Prepare for -rc1 

Signed-off-by: Junio C Hamano <[email protected]> 

(這裏的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] 

每個輸出線開始於一個「模式」,這是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 is被提交Bgit revert做,它很可能是AC使用相同的頂級樹(自動意味着它們將使用所有相同的子樹和斑點)。

+0

我真的很想知道如何讓git將可導入的格式(可能是csv)轉換爲某種格式化的應用程序,visio .. maltego? –

+0

如果你想要的只是提交,那不是太難:'git rev-list --parents'完成大部分工作。如果你想下降樹和blob,你將不得不編寫自己的代碼:添加'--objects'將打印樹和blob ID,但不是它們的類型。 (對於blob,你可以通過路徑名的存在來推斷出類型,但是這並不能區分樹和父級提交。) – torek

+0

'git rev-list --parents --objects | git cat-file --batch-check ='%(objectname)%(objecttype)%(rest)'是快速獲取快照結構的方法,您仍然需要在發現的樹上執行ls-tree來獲取每個快照的結構。 (編輯:我更喜歡你的'git cat-file -p',善良而忘記我說的ls-tree) – jthill