1. 程式人生 > 實用技巧 >git第一次commit程式碼閱讀

git第一次commit程式碼閱讀

目錄

獲取 git 第一次commit

git log --reverse 倒敘檢視日誌

獲取滿足範圍的commit

git 的第一次commit

獲取對應tag

在github的Switch branches/tags選擇對應tag

或者

克隆下整個git專案,執行

git tag 檢視所有tag.

git checkout <tag-version> 切換到對應tag.

閱讀README

介紹了git來源於get的誤讀

介紹了設計上的兩個抽象

  •  object database
    
  •  current directory cache
    

物件

Tree:
存放所提交的檔案列表,檔案列表每一行描述所記錄的一個檔案,包括:檔案的許可權、路徑名、SHA1值。
這個就能夠用於儲存每一次提交的具體內容,通過查詢tree檔案,可以知道該次提交時所含有的所有檔案,然後根據每一個檔案的SHA1,可以在object database中搜索出該檔案。這樣就達到了儲存每一次提交的具體內容的目的。

BLOB:
blob檔案是指具體的檔案內容,即我們所提交的檔案。
Blob檔案會被壓縮,然後計算SHA1值,所以如果檔案的內容沒有發生變化,那麼就不會產生新的Blob檔案。因為它們算出的SHA1是相同的,而SHA1值就是它們實際的存放路徑。

Commit:
commit檔案是用於記錄每一次提交的檔案。包含的內容有:tree、parents、author、committer、changelog。其中tree是指用於儲存此次提交的tree檔案。Parents是指此次提交的父分支是哪些,也是對應的tree檔案。Author、committer、changelog是提交的記錄資訊。

物件間關係

一個commit 包含 tree物件,author, commiter, log-info,
tree物件中又包含許多blob 物件

閱讀程式碼

編譯專案

環境wsl-ubuntu

安裝zlib開發包

sudo apt install zlib1g-dev

安裝openssl開發包

sudo apt install libssl-dev

修改編譯選項, 將Makefile中LIBS= -lssl修改為LIBS= -lcrypto -lz

執行make後,會獲得7個可執行檔案

程式碼閱讀

工具

檢視函式依賴關係

GNU cflow

基於makefile建立依賴關係

makefile2graph

之後的發展

為了將可執行檔案進行統一管理,git進行了分層設計,底層使用C實現的管道系統,高層為使用shell指令碼實現的瓷器系統(即使用者使用的介面)

隨著指令的進一步增加,一些指令碼命令通過向c生成的git程式傳參實現了。例如git-commit.sh在這個版本被替換為C實現。

參考

fabiensanglard

如何閱讀原始碼-zhangguixv

Git原始碼學習