如果在Git存储库中跟踪了压缩包(.tgz文件),Git如何知道两次提交之间是否已更改?
我希望复制该行为/功能,以便确定两个不同的tarball之间是否有变化。
我又要做什么? 我想创建一个可以比较tar包的脚本,而不必使用git
答案 0 :(得分:2)
Git知道tar文件是否已更改,就像检测其他文件是否已更改一样:它会比较文件的内容。这可能很天真,例如逐字节比较它们,或者先计算文件的哈希值,然后比较哈希值。由于Git在内部将所有已知文件及其哈希存储在其中,因此可以使用它代替进行昂贵的逐字节比较。
要使用该功能,您可以简单地使用Git本身来比较文件系统上的任何两个文件:
git diff --no-index file1.tgz file2.tgz
或者,如果您没有可用的Git,则可以改用普通的diff
命令。
另一种选择是手动计算两个文件的校验和并比较校验和。如果校验和不同,则保证文件不同。如果校验和相同,很可能文件内容也相同,但是仍然存在哈希冲突的可能性,因此可以肯定的是,您必须逐字节比较文件。
计算和比较两个文件的校验和的简单方法如下:
test "$(sha1sum <file1)" = "$(sha1sum <file2)"
请注意IO重定向,即使文件具有不同的文件名,输出也一样。
您当然可以使用任何其他哈希算法,例如sha256sum