Git物件(objects)簡介

2021-09-24 11:34:15 字數 2812 閱讀 5299

git物件一共有三種:資料物件、樹物件以及提交物件,這些物件都被儲存在了.git/objects目錄下, 下面我們將通過git命令來觀察,分析這幾個物件的產生過程,以期對git版本控制系統的內部原理有個深入的理解。

資料物件的產生是在使用git add命令將檔案或者目錄加入到暫存區時產生的,git會把乙個檔案中要儲存的資料和乙個頭部資訊一起做sha-1雜湊運算,將得到的雜湊值作為這個檔案的路徑,下面我們將通過具體過程來進行展示和分析。初始化乙個git倉庫,將乙個test.txt加入倉庫暫存區

這時我們去objects目錄下就會看到乙個檔案 12/651515fdbe068a7c5c74e3af3ba9be428d6f51

該檔名是由檔案原內容加上特定頭部資訊一起做sha-1雜湊值得到的,雜湊值前兩字元用於命名子目錄,餘下的38個字元則用作檔名,這樣我們就已經得到了乙個git下的資料物件

我們很好奇這個檔案到底儲存了什麼東西,我們使用vim開啟發現資料是被壓縮的

我們可以通過cat-file命令來檢視這個檔案中的資料,為cat-file指定-p選項可以指示該命令自動判斷內容的型別,並未我們顯示格式友好的內容

顯示的內容與加入暫存區之間檔案中的內容是一樣的,所以其實這個雜湊值路徑檔案中儲存的只是原始檔的一種壓縮形式。

檔案是這樣加入到暫存區的,如果我用git add 將乙個目錄增加到暫存區會怎樣:

經過上面的過程我們將乙個有乙個檔案的目錄加入到了暫存區,我們檢視objects後發現僅僅只是多了乙個新檔案

使用cat-file 命令觀察發現 該檔案中沒有任何關於目錄test的資訊,git僅僅將裡面的檔案new.txt轉化為git中的乙個資料物件。要解決git如何儲存目錄資訊這個問題我們就得了解樹物件。

接下來我們**git中的樹物件, 它能解決檔名儲存問題,也允許我們將多個檔案組織到一起, git以一種類似於unix系統的方式儲存內容,但做了些許簡化。所有內容均已樹物件和資料物件的形式儲存,其中樹物件對應了unix中的目錄項,資料物件大致對應了檔案內容。現在我們通過git commit

命令來觀察生成的樹物件

我們將前面放在暫存區的檔案進行commit

最後兩行顯示,git為每乙個檔案設定了檔案模式100644,表明這兩個檔案都是普通檔案, 其他兩種種模式選擇包括:100755,表示乙個可執行檔案;120000,表示乙個符號鏈結。上述三種模式即是git資料物件的所有合法模式(當然對於目錄項和子模組還有其他的一些模式)

提交之後我們再次觀察objects目錄內容:

我們可以看到這裡面多了三個檔案(為了方便起見我使用整個雜湊值的前6個字元來表示該檔案)

分別是012d1f、1360eb和ee0b2b,在接下來樹物件的討論中我們主要分析012d1f和ee0b2b,而1360eb則屬於提交物件的內容

我們使用cat-file -p讀取ee0b2b檔案, 這個檔案中包含了一條樹物件記錄和乙個資料物件記錄,其中每條記錄都指向乙個資料物件或者是子樹物件的sha-1指標以及相應的模式、型別、檔名

第一條記錄表示該樹物件指向乙個126551的資料物件,樹物件的檔名為test.txt,模式為100644

第二條記錄表示該樹物件指向乙個012d1f的樹物件,樹物件的名字為test,模式為040000(表示該檔名為乙個目錄)

然後我們讀取 012d1f 樹物件

該樹物件包含乙個指向698e7f的資料物件的指標,檔名為new.txt,模式為100644。

根據上面的分析我們弄清楚了目錄問題:git會將乙個目錄儲存為乙個樹物件進行儲存, 這個樹物件中會有每個子目錄的樹物件條目和每個檔案的資料物件條目,這樣就可以根據一種樹結構來儲存整個目錄。

我們經歷了完整的一次git提交過程,現在我們來思考一下git提供的這三種物件帶來的高效率,首先git會對所有的檔案內容進行壓縮,這使得即使倉庫中儲存了非常多的內容,而.git也不會很大,然後就是速度,考慮這樣的情況,當我們修改了乙個檔案的時候,git會去計算這個檔案的sha-1雜湊值,如果該雜湊值所得到的路徑已經存在,那就說明,這個檔案並沒有被真正修改(或許是改了然後又改了回來。。。。),這不會帶來任何字串匹配問題,只是乙個路徑搜尋過程,如果我們真正的修改了乙個檔案,那麼git會計算這個檔案的雜湊值,然後將這個檔案壓縮儲存在objects中,這樣我們需要建立乙個相應的樹結構來對原來的提交進行更改,這其實並不是乙個困難的過程,我們只要為每一次提交都建立乙個頂層樹物件來表示這個提交快照。git可能會對比前乙個提交的頂層樹物件,然後將沒有改變的樹物件或資料物件直接複製到新建立的這個頂層樹物件中,將改變的樹物件像這樣遞迴的進行。所以說決定你倉庫大小的並不是完全在於每個檔案的大小,而是你修改提交的次數,修改的次數越多,產生的樹物件和資料物件也就越多。

Objects檢測物件是否為空值的方法

objects檢測物件是否為空值的方法 1.檢測引用資料型別時 objects.nonnull heroimglist 括號中為單個引用資料型別的資料 if objects.nonnull heroimglist 2.檢測集合 多個引用或者基本資料型別合在一起 objects.nonnull 指向集...

git 命令簡介

檢視工作區修改後的檔案和本地版本庫中檔案的不同 git diff filename 檢視本地版本庫的當前狀態 git status 檢視版本日誌 git log 檢視精簡的日誌 git log pretty oneline 檢視命令記錄 git reflog 在本地倉庫中我們能夠看到的檔案為工作區,...

Git使用簡介

在 windows 上安裝 初次執行配置 第乙個要配置的是你個人的使用者名稱和電子郵件位址。這兩條配置很重要,每次 git 提 交時都會引用這兩條資訊,說明是誰提交了更新,所以會隨更新內容一起被永久納入歷史記 錄 git config global user.name john doe git co...