Git “对象”之blob

4,994 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情

.git文件中我们通过git cat-file -t命令,可以查看文件类型.然后就引出了我们的主角blob对象.上文中侧重点在于讲解.git文件变化.今天我们好好欣赏一下新对象blob.

您能在这里看到啥

  • Git对象
  • blob对象

Git对象

  • 引言

    Git是一个内容寻址文件系统,Git的核心部分就是一个简单的键值对数据库.你可以向Git仓库插入任意类型的内容.它会返回一个唯一的键.通过该键可哟在任意时刻再次取回该内容.

  • Git对象类型有四种:

    • 数据对象- blob
    • 树对象- tree
    • 提交对象- commit
    • 标签对象 - tag

    通过上面的四种对象搭建起了Git数据结构

blob对象

  • blob对象含义

    blob对象又叫数据对象

    数据对象的产生是在使用git add命令,将文件或者目录加入暂存区-staging时产生的.

    对象本质就是二进制的数据文件.只包含文件的内容,并不存储文件名文件权限.

    文件名将在tree对象中存储

  • blob对象存储方式

    Git对象中,我们知道Git的核心部分是键值对数据库.blob对象也不例外.这里我就直接引用网上的图了,如下所示

    662394-20190323084613489-2138106048.png

  • blob对象存储方式及位置

    • 存储位置

      在学习.git文件的时候.我们知道.git文件结构如下所示

       **.**
       ├── COMMIT_EDITMSG
       ├── HEAD
       ├── config
       ├── description
       ├── **hooks**
       ├── index
       ├── **info**
       ├── **logs**
       ├── **objects**
       └── **refs**
      

      当执行过git add命令后,这时候我们去.git/objects/目录下,就会看到一个文件76/2c98e3.如下所示

      截屏2022-11-22 10.18.41.png

      由此我们可以知道blob对象是存储在.git/objects/目录下.

    • 对象存储方式

      Git对象的的键使用40位的16进制数表示的.即SHA-1散列值.如762c983e33c2968ef90e5504c584a47f54a5c9c8

      .git/objects文件中,我们不难发现.文件是由散列值前两位字符76用于命名子目录.剩下38字符串为文件名.

  • 查看blob对象内容

    • cat命令来查看对应内容.
      cat .git/object/76/2c983e33c2968ef90e5504c584a47f54a5c9c8
      xK??OR04`x?1????=ӸGS **%**
      

      从上面的实战中,发现是乱码.为啥是乱码的.主要是我们的文件内容显示通过zlib压缩,然后将zlib压缩后的内容写入磁盘文件.所以我们不能简单的通过cat指令获取内容.需要用git提供的命令获取内容

    • git cat-file
      • 查看blob对象的内容
        git cat-file -p 762c983e
        初始化
        
      • 查看对象类型
          git cat-file -t 762c983e
          blob
        
  • Git底层命令创建blob对象

    git hash-object可以将任意数据保存到./git/object目录下,虽然我们可以通过git add也能实现.但多学一种方式,总是有用的.相对来说git add是属于高级命令,而真正做事的还是git hash-object这种更底层的命令.

    echo "hellow" | git hash-object -w --stdin
    4f6caba6e267fd5ddbc3e49af8843a1af1ab0793
    

    参数说明:

    参数说明
    -w返回键(SHA-1),并将该内容得到blob对象写入到.git/objects文件中.
    --stdin标准输入读取内容
  • blob对象取回数据

    在上面git cat-file使用事例中,我们可以获取blob对象内容.现在我们利用它再取回被删除的内容.如下所示

    截屏2022-12-13 20.31.42.png

系列文章

学习资料