Command-Line
如何使用 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 進行簡單導出時,內部時間戳會根據送出的時間戳進行初始化。當您使用更高級的過濾選項時,時間戳將設置為目前時間。要改變行為,你需要 fork/patch 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);