git檔案物件

2021-10-25 00:07:44 字數 2279 閱讀 5016

git檔案物件

一、.git資料夾分析

.git資料夾有git倉庫管理的必須檔案,且只有當前目錄有.git檔案才能使用git命令。通過git clonegit init命令初始化。

•object資料夾:儲存了檔案物件,並使用sha-1演算法生成40位雜湊值將前兩位作為資料夾,後38位作為檔名。

•config檔案:git倉庫的配置檔案,跟git config命令有關。

•head檔案:分支的指示指標,head指向哪個分支表示當前git倉庫處於哪個分支上。

•index檔案:表示暫存區。

二、檔案物件

git有三種檔案物件,分別是blob、tree、commit。blob物件儲存當前版本的檔案快照,tree儲存著目錄結構和 blob 物件索引,commit儲存著指向前述樹物件的指標和所有提交資訊。舉個例子:

1、在test_1資料夾裡面初始化了git庫,並且建立乙個檔案test_1.c,並寫入include

2、使用git add test_1.c將test_1.c檔案加入暫存區,可以在./test/.git/objects/下生成了乙個新的資料夾35(這是數字是sha-1演算法生成的,將前兩位作為資料夾名,後38位作為檔名),35資料夾下有乙個名為4499acd60e01f6d3b56ed83f0a8d077effb0f2的檔案,該檔案就是blob物件,儲存的是test_1.c的檔案快照。使用git cat-file -p 354499(這個命令可以查詢4499ac這個檔案的內容,-t檢視物件型別的有blob、tree、commit三種型別,384499是40位雜湊值的6位縮寫代表乙個檔案物件)查詢,可以得出命令的輸出值就是前面寫入的include,使用-t引數輸出blob,也就代表當前的物件屬於blob物件。所以當一次修改被加入暫存區時git會用blob儲存當前修改的檔案快照,同乙個目錄下對於同名內容一致的檔案採用同乙個物件儲存,也就是說在當前目錄下,假設是另乙個資料夾下有乙個test_1.c且內容和前乙個一致,那麼這兩個檔案共用同乙個檔案物件,即354499。

3、為了解釋tree和commit物件,在test目錄下新建乙個test_2資料夾,並且建立test_2.c檔案,寫入#include。提交到暫存區git add test_2,然後git commit提交git倉庫。然後轉到objects資料夾會發現物件檔案變成了5個,如下圖。為什麼會變成5個?按照之前的理解是add了兩個檔案,所以有兩個blob物件,然後commit一次後會產生乙個tree物件和乙個commit物件,總共應該是4個物件檔案。實際上不是這樣的,準確來說git會為每個資料夾生成乙個tree物件,類似檔案目錄的樹結構,在本例中有兩個資料夾因此git生成了兩個tree物件,所以總共有5個檔案物件。下面細看這幾個檔案物件的內容,blob物件就不重複說了。git cat-file -p 檔名97、c8、ff輸出如下圖,可以得出97是commit物件,包含了提交資訊和tree的指標,該物件指向ff物件。我們看看ff tree物件的內容,包含了乙個blob物件記錄test_1.c檔案資訊,還包含乙個樹物件指向c8即test_2資料夾。最後看看c8 tree物件,包含乙個blob物件記錄test_2.c檔案資訊。由此可以分析出git將資料夾目錄下的檔案資訊抽象成blob物件,並將這個集合抽象成tree物件,根據資料夾的層級抽象出多棵子樹。最後將根節點抽象成乙個commit物件。

三、總結

現在回過頭來看git的檔案區間是不是感覺很好懂,git相當於乙個檔案管理員,本地檔案未add時,git並不知道這個檔案,一旦add git就將這些檔案生成blob物件並納入管理,在暫存區(index)生成相應的索引,使用git ls-files --stage可以檢視index檔案的內容,可以看到index檔案儲存的就是blob物件的雜湊值和檔案路徑。commit做的事就是將blob物件打包成tree和commit物件,儲存到本地倉庫,這相當於一次改動的集合。仔細思考為什麼git的所有操作都這麼的迅速,主要的原因是每次add、commit操作時都以物件檔案的方式儲存了所有的改動資訊,這些物件檔案都有不重複的雜湊值,且相同的檔案具有相同的雜湊值,通過雜湊值的校驗,git可以快速的進行操作。

Git學習筆記(四) Git物件

git cat file t id號 檢視此id號對應的物件型別 commit tree parent blob git cat file p id號 檢視此id號對應的物件內容 這些物件儲存在git庫中的objects目錄下 id前兩位作為目錄名,後38位作為檔名 通過commit物件之間的相互關...

git物件(git權威指南筆記)

1 檢視日誌詳盡輸出 git log l pretty raw id型別 commit tree 目錄 blob 檔案 檢視id型別 git cat file t id 檢視物件內容 git cat file p id git cat file p 668bcec git cat file p a1...

git學習 七 git 物件庫

1 git log l pretty raw 檢視日誌 l是幹啥的 2 git log pretty raw 3 git cat file t 雜湊值 檢視id的型別 不知道為啥這裡我不一樣 即使用git log l pretty raw也只是出現commit的,但是git cat file p 雜...