git如何知道tarball是否已更改?

时间:2018-08-05 17:49:25

标签: git tar checksum sha1sum

如果在Git存储库中跟踪了压缩包(.tgz文件),Git如何知道两次提交之间是否已更改?

我希望复制该行为/功能,以便确定两个不同的tarball之间是否有变化。

我又要做什么? 我想创建一个可以比较tar包的脚本,而不必使用git

1 个答案:

答案 0 :(得分:2)

Git知道tar文件是否已更改,就像检测其他文件是否已更改一样:它会比较文件的内容。这可能很天真,例如逐字节比较它们,或者先计算文件的哈希值,然后比较哈希值。由于Git在内部将所有已知文件及其哈希存储在其中,因此可以使用它代替进行昂贵的逐字节比较。

要使用该功能,您可以简单地使用Git本身来比较文件系统上的任何两个文件:

git diff --no-index file1.tgz file2.tgz

或者,如果您没有可用的Git,则可以改用普通的diff命令。

另一种选择是手动计算两个文件的校验和并比较校验和。如果校验和不同,则保证文件不同。如果校验和相同,很可能文件内容也相同,但是仍然存在哈希冲突的可能性,因此可以肯定的是,您必须逐字节比较文件。

计算和比较两个文件的校验和的简单方法如下:

test "$(sha1sum <file1)" = "$(sha1sum <file2)"

请注意IO重定向,即使文件具有不同的文件名,输出也一样。

您当然可以使用任何其他哈希算法,例如sha256sum