git 如何知道压缩包是否已更改?

How does git know if a tarball has changed?

如果在 Git 存储库中跟踪 tarball(一个 .tgz 文件),Git 如何知道它是否在两次提交之间发生了变化?

我想复制那个 behavior/functionality,这样我就可以确定两个不同的 tarball 之间是否有变化。

再一次,我想做什么? 我想创建一个可以区分 tarball 的脚本,而不必使用 git

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

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

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

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

另一种选择是手动计算两个文件的校验和并比较校验和。如果校验和不同,则文件保证不同。如果校验和相同,很可能文件内容也相同,但还是有哈希冲突的可能性,所以为了确定,你必须逐字节比较文件。

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

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

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

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