1. 程式人生 > >git原始碼剖析-init-db

git原始碼剖析-init-db

我們先找到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值的。