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,它会创建临时文件,内容变为可阅读的。

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