【问题标题】:How to create a tar file that omits timestamps for its contents?如何创建一个省略其内容时间戳的 tar 文件?
【发布时间】:2016-01-04 23:56:30
【问题描述】:

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

我们为什么要这样做?

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

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

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

【问题讨论】:

  • 你有没有找到完整的答案?我也想做同样的事情,在这里提出一个问题:stackoverflow.com/questions/45734702/… 我还想确保不存储用户、组和权限。还有什么需要注意的吗?
  • @TomEllis,如果您想精确控制哪些权限被存储和哪些不被存储,我会考虑使用 Python tarfile 模块构建一些自定义的东西。

标签: build timestamp archive tar


【解决方案1】:

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

我最终得到了

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

【讨论】:

  • 注意:此解决方案需要 GNU tar 1.28 或更高版本。
  • 您是否还需要强制执行明确定义的排序顺序,也许通过设置环境变量LC_ALL=c
  • @Mickalot,您明确在问题中说:我们希望利用 tar 保留的其他文件元数据,要求答案仅限于讨论时间戳。将接受位转移到不符合该规范的答案让我觉得移动了球门柱。
  • 这个问题是关于按位幂等性的,所以我认为答案应该包括有助于实现该目标的任何内容,包括文件所有权和排序顺序。
【解决方案2】:

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

【讨论】:

  • 如何在 macOS 中做到这一点?我找不到--mtime
  • @mljrg : macOS 上的标准 tar 是基于 bsd 的,BSD tar 不同于 GNU tar。要安装 GNU tar,如果您使用自制软件,您可以使用 brew install gnu-tar,这使得 GNU tar 可以作为 gtar 使用。
  • @Mickalot 谢谢!
【解决方案3】:

我们可以创建不附加时间戳的 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

【讨论】:

  • tar -c 确实在存档中包含修改时间(时间戳)。
猜你喜欢
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-25
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
相关资源
最近更新 更多