git-archive를 사용하여 결정적 tar.gz를 만드는 방법은 무엇입니까?

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를 만드는 방법은 무엇입니까?

ベストアンサー1

단순 내보내기에 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);

おすすめ記事