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

时间:2015-10-07 16:22:58

标签: build timestamp archive tar

有没有办法创建一个.tar文件,省略其文件/目录的atime / ctime / mtime值?

我们为什么要这样做?

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

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

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

3 个答案:

答案 0 :(得分:14)

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

答案 1 :(得分:1)

要拥有真正等幂的tar,mtime是一个很好的步骤,但还不够。 您还需要为mtime设置排序顺序,所有者和组(以及它们的映射)和正确的时区(否则,在Mac和Linux之间也会出现问题)。

我最终以

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

答案 2 :(得分:-3)

我们可以在没有附加时间戳的情况下创建tar文件。

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

Dockerfile

2)使用压缩创建tar文件,没有时间戳

tar -cf file_name.tar file_name

3)替代方式

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

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

4)提取tar文件

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

验证您可以这样做

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