Git 是如何保证完整性的

1,613 阅读3分钟

Git 相信大家每天都在使用,但是心中一直有一个疑问,假如在传送过程中丢失信息或者损坏文件,Git 是怎么发现的?

1.Git 官方的说明

其实,Git 中所有的数据在存储前都会计算校验和,然后以校验和来引用。这意味着不可能在 Git 不知情时更改任何文件内容或目录内容。

Git 用以计算校验和的机制叫做SHA-1 散列(hash,哈希)。

这是一个由 40 个十六进制字符(0-9 和 a-f)组成的字符串,基于 Git 中文件的内容或目录结构计算出来。

SHA-1 哈希看起来是这样:

24b9da6552252987aa493b52f8696cd6d3b00373

Git 数据库中保存的信息都是以文件内容的哈希值来索引,而不是文件名。

那么问题来了,啥是校验和,啥是 SHA-1? 🤔

2.什么是校验和

来看看维基百科的定义:

校验和(英语:Checksum)是冗余校验的一种形式。

它是通过错误检测方法,对经过空间(如通信)或时间(如计算机存储)所传送数据的完整性进行检查的一种简单方法。

计算机领域常见的校验和的方法有循环冗余校验(CRC)MD5SHA家族等。

产生检验和的实际过程一般是向核对函数或检验和算法输入给定的数据,一个良好的检验和算法通常会对进行很小的修改的输入数据都会输出一个显著不同的值。

所以 Git 的做法就是通过文件内容或者目录结构计算校验和,只有校验和完全一致时才能证明文件或者目录没有发生丢失(因为任何微小的变化都会产生截然不同校验和结果)。

3.SHA-1

SHA-1 是常用的一种计算校验和的算法,其他常用的算法还有 md5 和 sha-256。

4.如何查看文件的校验和

Linux 和 Mac 下获取文件的 CRC、MD5、SHA1、SHA256 值是一样的方式:

cksum 文件名    # CRC
md5sum 文件名   # 获取MD5
shasum 文件名   # 获取SHA1

# -a 支持可选值:1 (default), 224, 256, 384, 512, 512224, 512256
shasum -a 256 文件名   #获取SHA256

来实践一下👨🏻‍💻:

如图所示:

  • 第一次操作通过 shasum 命令获取了我电脑上的名叫 test.txt 文件的 SHA1 值;

  • 第二次操作修改了文件名,改为了 test1.txt,此时获取的 SHA1 值与第一次获取的一样,因此,更改文件名不会导致校验和改变;

  • 第三次操作修改了 test1.txt 文件里面的内容,此次获取 SHA1 值就发生了变化。

因此,我们可以得知:只有相同的文件才会有相同的校验和。更改文件名以外的任何内容都将导致不同的校验和。

5.校验和的常见应用场景

  • 检查下载的文件是否有破损

  • 检查下载的文件是否被恶意替换