代码之家  ›  专栏  ›  技术社区  ›  Alexander Mills

吉特怎么知道柏油球变了?

  •  1
  • Alexander Mills  · 技术社区  · 7 年前

    如果在Git repo中跟踪tarball(a.tgz文件),Git如何知道它在两次提交之间是否发生了更改?

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

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   knittl    7 年前

    Git知道tar文件是否已更改,就像它检测其他文件是否已更改一样:它比较文件的内容。这可能与逐字节比较它们或者先计算文件的散列,然后比较散列一样简单。由于Git内部存储所有已知文件及其散列,因此可以使用它来代替进行昂贵的逐字节比较。

    要使用该功能,只需使用Git本身来比较文件系统上的任意两个文件:

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

    或者,如果没有Git可用,可以使用 diff 而是命令。

    另一个选择是手动计算两个文件的校验和,然后比较校验和。如果校验和不同,那么文件肯定是不同的。如果校验和是相同的,那么很可能文件内容也是相同的,但是仍然存在散列冲突的可能性,因此为了确定,您必须逐字节比较文件。

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

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

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

    当然,您可以使用任何其他散列算法,如 sha256sum