创建一个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] 删除。
我来说两句