Git 存儲過程探究

1 一些基礎概念

1.1 SHA1

SHA1是密碼學上的一種算法,git通過它來識別文件。在git中,通過對“對象”進行計算得來的SHA1,來得到對該文件項目的索引。其中SHA1值是一個40 個字符大小的“對象名”。所有對該文件的索引,都是通過該SHA值進行的。


實例:


 

  1. ~/ChenOS$ git log
  2. commit 4931e7216c6128fc86ee517f644e0cabc5be1cdc
  3. Author: Li Shuo <[email protected]>
  4. Date: Sat Sep 1 08:44:26 2012 +0800
  5. 在emacs下測試一下
  6. commit 31ea7b0e2727c11250c45c0e4783a7c9bad79b42
  7. Author: Li Shuo <[email protected]>
  8. Date: Sat Sep 1 07:44:38 2012 +0800
  9. 對freedos進行忽略,不提交到版本庫
  10. commit 5380879d00d6cc47b68b43387715f844362c1e09
  11. Author: Li Shuo <[email protected]>
  12. Date: Fri Aug 31 20:47:37 2012 +0800
  13. add freedos.img, modified bochsrc and make it into protectmode
  14. commit c1007d90ff564de39dd4c5a53231cadf941816df
  15. Author: Li Shuo <[email protected]>
  16. Date: Fri Aug 31 20:03:46 2012 +0800


 

其中的commit後面跟着的就是SHA值。


1.2 bolb對象

bolb用來存儲文件的內容,它是一塊二進制數據。Blob對象不像Tree或者 commit對象一樣,它沒有指向任何東西或者其它屬性。所以說,它本質上就是一個存放文件內容的倉庫。


1.3 tree對象

一個tree對象通常有多個指向blob對象或者其它tree對象的指針,這個指針其實就是一個SHA值。tree對象一般用來表示內容之間的目錄和層次關係。


1.4 commit對象

commit對象指向一個tree對象,並且它本身帶有一些相關的描述信息。


2 實例測試


2.1 首先查看commit對象的SHA值

使用git last命令可以查看最近一次的提交,下面commit所跟的即是該次 commit的索引,我們可以利用該SHA值查看commit中的內容。


該命令的語法格式:

 

  1. git last

 

測試:

 

  1. ~$ cd ChenOS/
  2. ~/ChenOS$ git last
  3. commit 4931e7216c6128fc86ee517f644e0cabc5be1cdc
  4. Author: Li Shuo <[email protected]>
  5. Date: Sat Sep 1 08:44:26 2012 +0800
  6. 在emacs下測試一下


 


2.2 查看commit對象中的內容
 

從上一步中,我們找到了commit的SHA值,接下來可以使用該值查看commit的存儲結構。


該命令的語法格式:


  1. git show -s --pretty=raw [commit-SHA]

測試:


  1. ~/ChenOS$ git show -s --pretty=raw 4931e7216c
  2. commit 4931e7216c6128fc86ee517f644e0cabc5be1cdc
  3. tree f5b7e53e20b4fc8aea3050863c8e69962850c4a6
  4. parent 31ea7b0e2727c11250c45c0e4783a7c9bad79b42
  5. author Li Shuo <[email protected]> 1346460266 +0800
  6. committer Li Shuo <[email protected]> 1346460266 +0800
  7. 在emacs下測試一下

從命令的輸出結果上看,在commit中,存儲這該commit的索引,以及tree對象,父對象,作者和提交者的信息。在這裏,我們需要的只是tree對象的索引。


2.3 查看tree對象中內容

由上一步,我們找到了commit指向的tree對象,我們就查看tree對象裏面存着什麼。


語法格式:


  1. git ls-tree [tree-SHA]

測試:


  1. ~/ChenOS$ git ls-tree f5b7e53e20b
  2. 100644 blob e930018d222af541a6ec6ea93b7b09ae8af27141 .gitignore
  3. 100644 blob 83019b82b43bfdcff6cc3a0fb654a8c217644cb3 README
  4. 040000 tree 8034271b096fa202f664224651aade823918b4f3 V0.1

從輸出可以很清楚的看到,tree對象裏面包含着blob對象以及其它tree對象的索引。仔細看,其中那個tree對象索引是一個目錄,跟上面兩個的屬性不一樣。而在這裏,我們需要的是blob對象,我們希望知道blob裏面放着什麼。


2.4 查看bolb對象中內容

語法格式:


  1. git show [blob-SHA]

測試:


  1. ~/ChenOS$ git show e930018d222a
  2. V0.1/freedos.img
  3. *.img
  4. *.bin
  5. *.a
  6. *.o
  7. ~/ChenOS$ git show 83019b82b4
  8. This is my project of ChenOs.
  9. It's small , but all made by myself.

我們再用cat看看這兩個文件的內容:


  1. ~/ChenOS$ cat .gitignore
  2. V0.1/freedos.img
  3. *.img
  4. *.bin
  5. *.a
  6. *.o
  7. ~/ChenOS$ cat README
  8. This is my project of ChenOs.
  9. It's small , but all made by myself.

看清楚了吧,兩者實際上是一樣的,也就是說blob對象存儲着文件的內容。


3 總結

到現在,我們可以說基本上搞明白了git存儲過程。Git通過SHA值找到commit對象,在commit對象中存儲着對tree對象的索引;接着通過該tree索引,找到tree對象, tree對象中存儲着對blob對象和其它tree對象的索引;最後,通過索引找到blob 對象,而blob對象中則存儲着實際的文件內容。整個過程完成。

發佈了0 篇原創文章 · 獲贊 1 · 訪問量 8557
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章