回答
有兩個部分解決這個問題。一個非常簡單:從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
如果具有該名稱的對象是自身如果是普通文件,則另一棵樹或100644
或100755
之一。 (還有兩種模式,一種用於符號鏈接,另一種用於「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被提交B
的git revert
做,它很可能是A
和C
使用相同的頂級樹(自動意味着它們將使用所有相同的子樹和斑點)。
我真的很想知道如何讓git將可導入的格式(可能是csv)轉換爲某種格式化的應用程序,visio .. maltego? –
如果你想要的只是提交,那不是太難:'git rev-list --parents'完成大部分工作。如果你想下降樹和blob,你將不得不編寫自己的代碼:添加'--objects'將打印樹和blob ID,但不是它們的類型。 (對於blob,你可以通過路徑名的存在來推斷出類型,但是這並不能區分樹和父級提交。) – torek
'git rev-list --parents --objects | git cat-file --batch-check ='%(objectname)%(objecttype)%(rest)'是快速獲取快照結構的方法,您仍然需要在發現的樹上執行ls-tree來獲取每個快照的結構。 (編輯:我更喜歡你的'git cat-file -p',善良而忘記我說的ls-tree) – jthill
- 1. 本地git回購創建
- 2. 在bitbucket中創建私人git回購?
- 3. Git即時創建回購協議?
- 4. 如何創建一個Git回購
- 5. Git:創建回購作爲子模塊
- 6. 重新創建我的Git回購從此提交Json文件
- 7. GIT - 從另一個回購
- 8. 的Git從現有回購
- 9. Git回購版
- 10. 從已創建到位桶回購
- 11. 同步git回購私人回購
- 12. 回購裏面的Git回購
- 13. 使用Grit創建回購
- 14. GitHub - 開始創建回購
- 15. 如何創建具有不同結構的GIT本地回購GIT服務器回購
- 16. Git:如何使用符號鏈接創建本地回購協議Git主要回購
- 17. Git回購問題
- 18. 克隆git回購
- 19. Git鏈接文件夾從回購A到回購B
- 20. 從Git回購一次,將推到另一個回購
- 21. Git:從多個bitbucket回購進口到單個回購
- 22. 好的做法,從發佈的回購分離Git回購?
- 23. 在Ubuntu上創建一個本地Git回購框
- 24. 爲一個新的git回購重新創建文件
- 25. 通過restful API在GitHub上創建新的Git回購?
- 26. 爲項目骨架創建一個git回購
- 27. 在自託管服務器上創建遠程Git回購
- 28. `git` - 無法創建`achive`現有的回購
- 29. 如何將git回購變更爲git流回購
- 30. 維護包含其他克隆git回購的git回購
這取決於你想要繪製什麼。 – pvg
基本上所附的圖像顯示。 COMMIT ID - > TREE ID - > BLOB/TREE's –
編輯您的問題以添加該信息,但如果您知道自己想要繪製的圖形,則不完全清楚您要求的內容。如何從git中獲取數據? – pvg