如何使用git-archive创建确定性的tar.gz?

肾上腺素

创建一个git仓库进行测试。

~ $ mkdir somefolder
~ $ cd somefolder/
~/somefolder $ git init
Initialized empty Git repository in /home/user/somefolder/.git/
  ~/somefolder $ echo test > xyz
  ~/somefolder $ mkdir somefolder2
  ~/somefolder $ echo test2 > ./somefolder2/zzz
  ~/somefolder $ git add *
  ~/somefolder $ git commit -a -m .
[master (root-commit) 591fda9] .
 2 files changed, 2 insertions(+)
 create mode 100644 somefolder2/zzz
 create mode 100644 xyz

将整个存储库转换为tar.gz时,将生成一个确定的文件。例子。

  ~/somefolder $ git archive \
>    --format=tar \
>    --prefix="test/" \
>    HEAD \
>    | gzip -n > "test.orig.tar.gz"
  ~/somefolder $ sha512sum "test.orig.tar.gz"
e34244aa7c02ba17a1d19c819d3a60c895b90c1898a0e1c6dfa9bd33c892757e08ec3b7205d734ffef82a93fb2726496fa16e7f6881c56986424ac4b10fc0045  test.orig.tar.gz

再次。

  ~/somefolder $ git archive \
>    --format=tar \
>    --prefix="test/" \
>    HEAD \
>    | gzip -n > "test.orig.tar.gz"
  ~/somefolder $ sha512sum "test.orig.tar.gz"
e34244aa7c02ba17a1d19c819d3a60c895b90c1898a0e1c6dfa9bd33c892757e08ec3b7205d734ffef82a93fb2726496fa16e7f6881c56986424ac4b10fc0045  test.orig.tar.gz

作品。

但是,当更改次要细节时,仅压缩子文件夹时,它不会以确定性文件结尾。例子。

  ~/somefolder $ git archive \
>    --format=tar \
>    --prefix="test/" \
>    HEAD:somefolder2 \
>    | gzip -n > "test2.orig.tar.gz"
  ~/somefolder $ sha512sum "test2.orig.tar.gz"
b523e9e48dc860ae1a4d25872705aa9ba449b78b32a7b5aa9bf0ad3d7e1be282c697285499394b6db4fe1d4f48ba6922d6b809ea07b279cb685fb8580b6b5800  test2.orig.tar.gz

再次。

  ~/somefolder $ git archive \
>    --format=tar \
>    --prefix="test/" \
>    HEAD:somefolder2 \
>    | gzip -n > "test2.orig.tar.gz"
  ~/somefolder $ sha512sum "test2.orig.tar.gz"
06ebd4efca0576f5df50b0177d54971a0ffb6d10760e60b0a2b7585e9297eef56b161f50d19190cd3f590126a910c0201616bf082fe1d69a3788055c9ae8a1e4  test2.orig.tar.gz

由于某种原因,这次没有确定性的tar.gz。

当只想压缩单个文件夹时,如何使用git-archive创建确定性的tar.gz?

蒂姆·奥滕

使用HEAD进行简单导出时,将基于提交的时间戳初始化内部时间戳。当您使用更多高级筛选选项时,时间戳记将设置为当前时间。要更改行为,您需要派生/修补git并更改第二种情况,例如概念证明:

diff --git a/archive.c b/archive.c
index 94a9981..0ab2264 100644
--- a/archive.c
+++ b/archive.c
@@ -368,7 +368,7 @@ static void parse_treeish_arg(const char **argv,
                archive_time = commit->date;
        } else {
                commit_sha1 = NULL;
-               archive_time = time(NULL);
+               archive_time = 0;
        }

        tree = parse_tree_indirect(sha1);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

确定性地压缩压缩的.tar.gz文件

来自分类Dev

如何创建zip / gz / tar文件,以确定文件是否早于UNIX或Linux中的特定日期

来自分类Dev

如何使用zlib创建与gz兼容的文件?

来自分类Dev

使用Nnetar建模(确定性)趋势

来自分类Dev

使用Git触发TeamCity非确定性构建

来自分类Dev

如何在R中创建tar.gz文件?

来自分类Dev

如何在C#中创建tar.gz文件

来自分类Dev

如何创建zip / gz / tar文件,用于确定文件是否早于UNIX或Linux中的特定日期

来自分类Dev

如何安装tar.gz文件

来自分类Dev

如何从tar.gz安装Wordpress?

来自分类Dev

如何安装.debian.tar.gz?

来自分类Dev

如何安装xfe-1.43.2.tar.gz?

来自分类Dev

如何更新tar.gz文件?

来自分类Dev

如何安装tar.gz文件

来自分类Dev

我应该使用.tar.gz吗?

来自分类Dev

如何使用pkg.tar.gz文件安装旧的Gitkraken?

来自分类Dev

如何卸载eclipse(使用.tar.gz安装)

来自分类Dev

安装后如何使用Java tar.gz?

来自分类Dev

如何使用webpack输出目录的内容创建tar.gz文件?

来自分类Dev

如何使用Windows的7-Zip GUI创建.tar.gz文件?

来自分类Dev

如何完全从Java中的内存(无文件)中的对象创建tar或tar.gz存档

来自分类Dev

Prolog:如何判断谓词是否是确定性的

来自分类Dev

如何在pymc中设置确定性变量的键

来自分类Dev

如何实现确定性单线程网络仿真

来自分类Dev

如何在pyspark中获得确定性随机排序?

来自分类Dev

如何确定性地获得可用空间?

来自分类Dev

确定性函数何时使用先前的计算值?

来自分类Dev

使用Java的securerandom获取确定性值

来自分类Dev

使用确定性参数变化运行nlrx仿真

Related 相关文章

热门标签

归档