Git儲存內容的位置與方式

admin發表於2018-07-22

Git是一個工具,只要熟練掌握它的操作就能完成工作中的絕大多數任務。

我們很少會考慮Git歷史提交資料儲存在哪,又以何種方式儲存,下面對此進行一下介紹。

首先看一段程式碼例項:

[JavaScript] 純文字檢視 複製程式碼執行程式碼
let obj = {
  webName: "螞蟻部落",
  address: "青島市南區"
}
obj.age = 4;
console.log(obj.webName);
console.log(obj.address);
console.log(obj.age);

上面是一個物件直接量簡單演示,物件直接量以鍵/值對方式儲存資料,通過鍵可以獲取對應的值。

本質上Git儲存資料的方式也是如此,鍵就是資料內容sha-1值,值自然是物件內容。

在E盤git目錄下初始化一個全新的倉庫,程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ cd /e/git

切換到git目錄。

[Shell] 純文字檢視 複製程式碼
$ git init

初始化一個全新的倉庫,git目錄下除了.git目錄(預設隱藏)外別無它物。

.git目錄中的objects子目錄就是用來儲存資料的,截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/22/003002k8zwni7088z8cwn4.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

其中兩個子目錄是系統自動建立的,可以看到當前並沒有儲存任何資料。

下面開始向裡面儲存資料,程式碼如下:

[Shell] 純文字檢視 複製程式碼
$ echo "螞蟻部落" | git hash-object -w --stdin

程式碼執行效果截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/22/003047a1l42a2p4znd7js2.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

解析如下:

(1)."螞蟻部落"是要儲存的內容。

(2).git hash-object命令用來儲存資料物件。

(3).-w表示不僅計算出內容的sha-1值,而且會將資料儲存,否則只會給出sha-1值。

(4).--stdin表示內容是通過標準輸入裝置獲取的,比如我通過鍵盤輸入。

(5).第二行是儲存內容的sha-1值。

現在再來看一下.git/objects目錄中的內容,截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/22/003109p7q79cqf7deimfgq.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

多出了一個子目錄,名字是21,它的內容是:

a:3:{s:3:\"pic\";s:43:\"portal/201807/22/003131s8x7bp8f47p7n44p.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

21子目錄中有一個檔案,名為0a3e5558a2c25c0a577a3f2555c2f82e5529c6。

內容儲存位置總結如下:

(1).儲存於.git/objects目錄中。

(2).以sha-1值的前兩位作為子目錄名稱,儲存內容的檔名字為sha-1值的後38位。

現在我們開啟儲存內容的檔案,截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/22/003204s9e94s4idtdwehxp.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

儲存的並不是原始資料“螞蟻部落”,而是通過zlib壓縮的內容。

下面根據sha-1值這個鍵來檢視對應的值(也就是儲存的資料):

[Shell] 純文字檢視 複製程式碼
$ git cat-file -p 210a3e5558a2c25c0a577a3f2555c2f82e5529c6

程式碼執行截圖如下:

a:3:{s:3:\"pic\";s:43:\"portal/201807/22/003243rbpoc9kjubbi7k9b.png\";s:5:\"thumb\";s:0:\"\";s:6:\"remote\";N;}

相關文章