提取给定的 tarball 并准确地重新启动它

May*_*mer 6 tar git

我的版本化项目使用上游 tarball 的内容。我想以能够准确地重新创建原始 tarball 的方式提取内容。原因是我不想在我的版本化项目中包含大的二进制 blob。延迟是不可靠的,通常会产生略有不同的 tarball。我怀疑压缩算法启发式在不同条件下会产生不同的结果。

编辑:使解决方案变得困难的另一个问题是某些版本控制系统 (git) 不跟踪空目录,因此排除了不涉及创建辅助元数据文件的解决方案。见我对豪克的评论。(感谢 Hauke 的这次编辑)。

n.s*_*.st 5

重新压缩文件可能会产生不同的存档,因为将文件附加到存档的顺序tar不一定稳定。为了确保文件按照原来的顺序重新压缩,请列出存档中的文件并将该列表保存到文件中:

tar -tf your-archive.tar > file-list.txt
Run Code Online (Sandbox Code Playgroud)

然后通过从您之前创建的列表中读取要添加的文件,以完全相同的顺序重新打包它们(因为该列表也可以包含目录,并且我们不想在此时深入到它们,所以我们需要)--no-recursion

tar -cf your-new-archive.tar --no-recursion -T file-list.txt
Run Code Online (Sandbox Code Playgroud)

假设没有任何文件(或其属性)发生更改,your-new-archive.tar将与your-archive.tar.

然而,在创建压缩档案时您会遇到一个问题:默认情况下,gzip会为其创建的每个压缩文件添加一个时间戳。为了避免这种情况,您必须将tar的输出通过管道传输到gzip(而不是使用 的tar开关-z)并使用以下命令禁用时间戳-n

tar -c --no-recursion -T file-list.txt | gzip -n > your-new-archive.tar.gz
Run Code Online (Sandbox Code Playgroud)