Parece que você não está apenas procurando por um mtime fixo dentro do TAR, mas por um tarball idêntico bit-a-bit, dado que os arquivos em si são idênticos. Isso é realmente mais complexo do que se pensa.
Dependendo da sua situação, nem todos os pontos podem ser relevantes, mas estou listando-os aqui para ficarem completos. No GNU tar você pode fazer o seguinte:
- defina o mtime usando
--mtime=<date>
. A partir da versão 1.29 (no Debian 1.28-1 on, você pode usar--clamp-mtime
para definir o tempo real do arquivo somente para arquivos / mais recentes / que o tempo fornecido. Isto é útil quando você quer dar aos arquivos gerados um timestamp comum. , mas deixe os outros arquivos sozinhos. - Para ter uma ordem previsível de arquivos no arquivo, use
--sort=name
(GNU tar 1.28 ou posterior). O comportamento padrão é--sort=none
, que armazena arquivos na ordem de diretórios. -
--owner=0 --group=0 --numeric-owner
para definir o proprietário (se você estiver criando o TAR de diferentes usuários). - as permissões podem ser diferentes devido a uma umask diferente. Use
chmod
antes da criação do arquivo ou use--mode=<CHANGES>
para alterá-los para que fiquem consistentes.
A iniciativa Reproducible Builds tem um artigo sobre a geração de arquivos idênticos bit-a-bit .
O artigo também fornece algumas soluções alternativas para versões mais antigas do tar, que também podem funcionar com outras implementações do TAR. Uma solução alternativa para o mtime especificamente é que você pode usar touch
antes de criar o TAR para definir o mtime como um valor fixo para todos os arquivos mais novos que uma determinada data. Para uma ordem previsível dentro do arquivo, use find
e sort
para passar uma lista de arquivos ordenada para TAR.
find build -print0 | LC_ALL=C sort -z
| tar --no-recursion --null -T - -cf product.tar
Consulte a documentação do GNU TAR e manpage para informações sobre as opções individuais.