git第一次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個可執行檔案
程式碼閱讀
工具
檢視函式依賴關係
基於makefile建立依賴關係
之後的發展
為了將可執行檔案進行統一管理,git進行了分層設計,底層使用C實現的管道系統,高層為使用shell指令碼實現的瓷器系統(即使用者使用的介面)
隨著指令的進一步增加,一些指令碼命令通過向c生成的git程式傳參實現了。例如git-commit.sh在這個版本被替換為C實現。