Git——對象——blob

  blob對象,只關注文件的內容。引用原著:

  Each version of a file is represented as a blob, Blobs, a contraction of “binary large object”, is a term that’s commonly used in computing to refer to some variable or file that can contain any data and whose internal structure is ignored by the program, a blob is treated as being opaque, A blob holds a file’s data but does not contain any metadata about the file or even its name

  這段描述中提到了blob的三個關鍵點。

  第一,blob與file的映射關係,這裏的file是指有內容的文件,不是文件夾。它與file的關係是,每一個Blob對應特定版本的file文件,這裏要區分版本庫的版本與file的版本,若版本庫提交N次,在這N次中,有M次變更了file文件,那麼file文件的版本是M次。  

  第二,blob的內容,它是二進制,包含文件的內容,但不包含文件的任何元數據。元數據是指文件的創建者,創建日期等這些數據。

  第三,blob的用途,它不能由用戶直接追加,修改,刪除內容,而是Git還原某個特定版本下文件內容的輸入來源(InputStream)。這個過程目前是不得而知的。

  它的操作有新增,查看,刪除(git自動清理)。

1、新增

  使用git hash-object創建blob對象,它的格式爲

git hash-object [-t <type>] [-w] [--path=<file>|--no-filters] [--stdin [--literally]] [--] <file>…
git hash-object [-t <type>] [-w] --stdin-paths [--no-filters]

  其中第一條命令是指參數爲文件,第二條命令的參數爲標準輸入。

  1. -t:表示類型,默認是blob對象,
  2. -w:表示寫入到底層數據庫中,即在.git/object目錄下有所體現。
  3. –-path:表示文件的路徑。
  4. –-stdin:表示標準輸入。

  Blob對象的創建,是根據文件的內容計算出126位的SHA1值,其中前兩位作爲文件夾,後124位作爲文件的名稱。相同的內容總是產生相同的SHA1值。

  默認情況下,文件從未追蹤狀態變爲已追蹤狀態時會自動創建blob對象,例如調用git add命令。也可以手動執行git hash-object命令,此時根據文件的內容和位置,分以下幾種場景

  當文件不存在內容時,無論它的位置,都不會創建blob對象。

  當文件存在內容時,文件在版本庫之外,需要調用

$ git hash-object -w --path --stdin I:\\Learn\\hello.txt
b4e2221a53babb005a00ce96b40f78035a3efb1c

  在object目錄下可以查看到此對象。

  當文件存在內容時,位置在版本庫中,若它是未追蹤狀態,不存在blob對象。是已追蹤文件,存在與之對應的blob對象。

2、查看

  打開object目錄的blob對象,它的內容是二進制的,無法查看。

  可以通過git cat-file命令查看blob的內容。cat-file功能很強大,其中之一便是可以查看blob對象的內容。

  執行git cat-file –p blobId > result.txt,打開result.txt可以看到與hello.txt文件內容相同。

$ git cat-file -p b4e2221
something happened

  也可以通過執行git unpack-file blobId,它會創建臨時文件,內容變爲可閱讀的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章