Git如何儲存內容

2021-08-07 11:18:25 字數 1540 閱讀 6349

經常使用git,有時候就會有個疑問冒出來:git是如何儲存我提交的這些內容的呢?今天總算花點時間搜尋了一番,有了個基本的概念,寫下來儲存。

git 和其他版本控制系統的主要差別在於,git 只關心檔案資料的整體是否發生變化,而大多數其他系統則只關心檔案內容的具體差異。這類系統(cvs,subversion,perforce,bazaar 等等)每次記錄有哪些檔案作了更新,以及都更新了哪些行的什麼內容,請看下圖。

git 並不儲存這些前後變化的差異資料。實際上,git 更像是把變化的檔案作快照後,記錄在乙個微型的檔案系統中。每次提交更新時,它會縱覽一遍所有檔案的指紋資訊並對檔案作一快照,然後儲存乙個指向這次快照的索引。為提高效能,若檔案沒有變化,git 不會再次儲存,而只對上次儲存的快照作一鏈結。git 的工作方式就像下圖所示。

這麼作的優點就是,git的幾乎所有操作都是本地操作,你可以即使不聯網,你依然可以檢視歷史,比較變更,提交修改,等到有網路時一次性傳上去,而這點對其它vcs是不可能的。

而本地操作的另乙個優點就是快!尤其在網路條件差的時候,這個優點更明顯。

那麼具體是如何實現的呢?

git為每個專案在根路徑下建立乙個.git目錄,它是 git 用來儲存元資料和物件資料庫的地方。該目錄非常重要,每次轉殖映象倉庫的時候,實際拷貝的就是這個目錄裡面的資料。目錄結構大致如下:

我們需要關注的是objects目錄,裡面存放的是git物件。結構大致如下:

這便是 git 儲存資料內容的方式──為每份內容生成乙個檔案,取得該內容與頭資訊的 sha-1 校驗和,建立以該校驗和前兩個字元為名稱的子目錄,並以 (校驗和) 剩下 38 個字元為檔案命名 (儲存至子目錄下)。

sha-1校驗和用於索引內容,前兩位用於建立目錄,這樣乙個目錄下不會有太多檔案,而後38位字元作檔案命名儲存在該目錄下,其內容是用gzip格式壓縮的,可以用命令檢視,檢視時需要完整的sha-1校驗和。

這裡用的git命令是

git cat-file

-p object-id

-p引數是pretty-print的意思

以上這種方式儲存的物件叫做鬆散物件(loose object),是以空間換時間的方式獲得對物件訪問速度的提公升。還有一種方式使用打包檔案(pack file),通過git gc來打包檔案以節省空間。

作為基本情況的了解就是這麼多,更多深入的研究這裡就不作涉及了。

git 連線 如何儲存密碼

credential helper store user name test email test password 1qaz2wsx我之前就是每一次操作都要輸入使用者名稱和密碼,繁瑣得很。現在給各位分享下git永久儲存賬戶名和密碼。方法一 安裝好git之後一般會在c盤的c users admini...

關於shell 如何讀取plist儲存內容

之前一直沒有用過shell 去處理plist形式的文件,今天學習試驗了一下,記錄下。首先建立乙份plist,內容自定義。原來mac這裡有乙個內建的plist tool usr libexec plistbuddy專門用來處理plist讀取操作,如下 p為plist path destpath usr...

git基礎內容

參考文章 repository 也叫倉庫,可以看作乙個目錄。版本庫中的每個檔案的修改 刪除都會被git跟蹤。在git bash中切換到某個目錄,用 git init將這個目錄變成git可以管理的倉庫。將檔案又工作區上傳到暫存區 git add readme.txt將暫存區檔案上傳到分支 git co...