如何创建一个省略其内容时间戳的 tar 文件?

How to create a tar file that omits timestamps for its contents?

有没有办法创建一个 .tar 文件,在 files/directories 中省略 atime/ctime/mtime 的值?

我们为什么要这样做?

我们在构建过程中有一个步骤生成一个工件目录,该目录被打包到一个 tar 文件中。我们希望构建步骤是幂等的——给定相同的输入,它每次都会产生完全相同的files/output。

理想情况下,我们还希望该步骤在干净的构建中 按位 幂等,以便我们可以使用连续构建的哈希值来检查是否没有任何变化。但是由于 tar 文件包含每个条目的时间戳 (atime/ctime/mtime),因此该构建步骤创建的 tar 文件永远不会与之前的 运行 按位相同,即使内容存档中的每个文件 按位相同。

有没有办法生成一个 tar 文件,省略其条目的时间戳,以便生成存档的步骤 可以 按位幂等? (我们想利用 tar 保留的其他文件元数据,例如文件模式位和符号链接。)

我们可以创建 tar 文件而不附加时间戳。

1) 创建 tar 没有压缩和时间戳的文件

tar -cf file_name.tar file_name

2) 创建 tar 压缩且不带时间戳的文件

tar -cf file_name | gzip -n > file_name.tar.gz

3) 替代方式

GZIP=-n tar -czf file_name.tar.gz file_name

注意:'-n'不会添加时间戳和名称

4) 提取 tar 文件

tar -xf file_name.tar and tar -xzf file_name.tar.gz

验证你可以这样做

file file_name.tar or file_name.tar.gz
output = file_name.tar.gz: gzip compressed data, from Unix

GNU tar 有一个 --mtime 参数,可用于在存档中存储固定日期而不是文件的实际 mtime:

tar --mtime='1970-01-01' input ...

使用 gzip 压缩 tarball 时,还需要指定 -n 以防止存储 tar 存档的名称和时间戳:

tar --mtime='1970-01-01' input ... | gzip -n >input.tar.gz

拥有一个真正的幂等tar,mtime是很好的一步,但还不够。 您还需要设置排序顺序、所有者和组(连同他们的映射)以及 mtime 的适当时区(否则您也会在 Mac 和 [=17 之间遇到问题=]).

我最后得到了

tar --sort=name --owner=root:0 --group=root:0 --mtime='UTC 2019-01-01' ... | gzip -n