git原始碼剖析-init-db
阿新 • • 發佈:2018-12-12
我們先找到git程式碼,然後找到git第一版的程式碼。
也就是這個,git clone下來。
我們看到第一次提交的檔案比較少。
通過make可以生成7個可執行檔案,也正說明了初代的git只實現了以下幾個功能。
要研究,我們先研究以下他們怎麼用。
功能:
1.使用init-db初始化工作目錄
2.增加自己寫的檔案
3.使用./update-cache test.c儲存更改至快取中。這會生成一個index檔案,改檔案用於儲存當前的cache。但是螢幕不會顯示。
4.使用write-tree提交快取中的更改。這會生成一個tree檔案,當前的cache中的檔案會寫入到tree檔案中去。命令結果會返回tree檔案的sha1值。
5.show-diff,用來比較當前工作目錄下的檔案和cache中記錄的檔案的區別。
6.cat-file<SHA1>,檢視某個檔案。會生成一個TEMP檔案用來儲存SHA1檔案中的內容。
這裡發現temp檔案後tree
資料結構:
GIT 核心資料結構有五個: object, blob, tree, commit,cache_entry。其中
- object: 基類。
- blob: 對應於一個檔案。
- tree: 對應於一個目錄。 一個 tree 包含一個或多個 blob 和 tree。
- commit: 對應於一個版本。 一個 commit 物件指向一個 tree 物件,該tree 物件對應於該版本的根目錄。 一個 commit 物件指向一個父 commit 物件, 表示它是該父commit 的下一個版本,或指向多個父commit 物件,表示它由這些父 commit 合併得到。
程式碼:
init-db:使用init-db初始化工作目錄,類似於git init的作用。
memcpy(path, sha1_dir, len);
for (i = 0; i < 256; i++) {
sprintf(path+len, "/%02x", i);
if (mkdir(path, 0700) < 0) {
if (errno != EEXIST) {
perror(path);
exit(1);
}
}
}
建立一個檔案.dircache,此檔案下有255個資料夾。
i迴圈255次,將i以16進位制格式作為資料夾名。
然後建立資料夾。
會得到如下的檔案
這些檔案都是空的
這些檔案使用來儲存SHA1值的。