我使用 .tgz/tarball 创建一个 .tgz/tarball $(npm pack)
。
然后我运行:
sha1sum oresoftware-npp-0.0.1001.tgz
我得到:
77c58da68593dcdcd14bb16a37f5f63ef42bab63 oresoftware-npp-0.0.1001.tgz
我想将该 shasum 与远程服务器上的另一个 tarball 进行比较。我可以在 NPM 注册表上查询 tarball 的 shasum,方法是:
npm view @oresoftware/npp@latest dist.shasum
产生:
3c2e7328110ba57e530c9938708b35bde941c419
这个 shasum 与上面的另一个不同,但这是预期的,因为我更改了 .tgz tarball 文件的内容。
我的问题有三层:
当我生成 .tgz 文件的 sha1sum 时
npm pack
,这是正确的方法吗?创建 tar 文件后生成 sha1sum?我假设如果 tarball 具有相同的内容,那么 sha1sum 将是相同的?如果文件是在不同时间创建/修改的,即使它们具有相同的内容,它们是否会有所不同?
有没有更好的方法来检查两个 tarball 是否具有相同的内容?这就是我想做的一切。
答案1
NPM 注册表提供的校验和提供两个功能:它们允许您验证下载的文件是否已损坏,如果您可以验证带外校验和,则下载的文件是否未更改。除非 NPM 存档是可重复构建的,否则校验和不允许您验证自己使用的存档是否npm pack
包含应有的内容。
tarball 的问题在于它们包含元数据:所存储文件的所有权、权限和时间戳,由 存储tar
,最重要的是,压缩元数据。如果所有这些值都是预先商定的,则可以指定它们来覆盖从文件系统获取的值,但这需要预先商定。
要比较两个任意 tarball 的内容,唯一可靠的方法是提取它们的内容并进行比较。
答案2
此校验和比较是否对您有用取决于您所使用的 tar 命令以及所使用的 tar 存档类型。
star
例如,包括自 1986 年以来的所有三个时间戳,这会导致即使内容相同的 tar 存档也会有所不同,因为上次访问时间不同。
通过 2001 年新的 POSIX tar 增强功能,还提供了所有三个时间戳 - 取决于 tar 实现是实现原始标准还是后来的更改。
如果您不关心时间戳,那么比较存档校验和并不是正确的方法。
因此,比较两个 tar 档案并从中做出陈述通常是不可能的。
但是,如果您可以解压缩两个存档之一,则有一种很好的方法可以将内容和元数据与用于比较的一组可配置元数据进行比较。使用star -diff
,参见http://schilytools.sourceforge.net/man/man1/star.1.html
如果您例如致电:
star -diff -v diffopts=!times < archive.tar.gz
比较文件内容和除所有时间戳之外的所有元数据。