새로 생성되었지만 동일한 파일을 반복적으로 압축하지만 zip의 샤섬이 계속 변경됩니다.

새로 생성되었지만 동일한 파일을 반복적으로 압축하지만 zip의 샤섬이 계속 변경됩니다.

후속작입니다같은 폴더에 파일을 반복해서 압축하는데 샤섬이 계속 바뀌네요본질적으로..

저장소의 일부를 압축하여 sha의 합계를 얻을 때 현재 커밋의 git sha가 포함된 파일을 추가하려고 합니다.

그러나 코드 git rev-parse HEAD > .gitsha를 내 zip에 추가하면 shasum내 zip이 매초마다 변경됩니다. zip 명령은 -X파일 타임스탬프를 무시하는 데 사용됩니다.

.gitsha다음 파일 만 시도했습니다.

$ git rev-parse HEAD > .gitsha ; shasum .gitsha
8fa263bc885822ccba03006ea10015ef32da485c  .gitsha

이는 시간이 지나도 일관되게 유지되었습니다.

그러나 압축 후에는 shasum더 이상 일관성이 없습니다.

$ git rev-parse HEAD > .gitsha ; zip -X --quiet -r test.zip .gitsha ; shasum test.zip
26cc38c624f91a1c555d503fdfdecb1ce670274f  test.zip

$ git rev-parse HEAD > .gitsha ; zip -X --quiet -r test.zip .gitsha ; shasum test.zip
b03f7cb654e3aa0d25d18ead5fe1f225bc2aac9f  test.zip

이는 몇 초 간격으로 진행되는 두 번의 시도입니다. -X로고에 제작 시간이 포함되지 않을 수도 있다고 생각했나요 ? 작동하게 하는 방법이 있나요?

업데이트: 우편번호를 제거해도 도움이 되지 않았습니다.

$ rm test.zip; git rev-parse HEAD > .gitsha ; zip -X --quiet -r test.zip .gitsha ; shasum test.zip
76c722ccf2df75fb624f9640ad948f4508dd6152  test.zip
$ rm test.zip; git rev-parse HEAD > .gitsha ; zip -X --quiet -r test.zip .gitsha ; shasum test.zip
6bd26d2bc821d9f12806fc81a8ba8c8babcc664a  test.zip

답변1

stringszip 파일에서 명령 출력을 확인합니다.

$ strings test.zip blah.zip                         
.gitshab9e1355d36643fefe94da0bee81533cd8cbb04d9
.gitshaPK
QH;F
.gitshab9e1355d36643fefe94da0bee81533cd8cbb04d9
QH;F
.gitshaPK

세 문자열의 내용은 동일하게 유지되지만 순서가 변경되었습니다. 따라서 zip 파일의 일부 구성 요소는 순서에 완전히 의존하지 않을 수 있습니다. 출력을 일정하게 만드는 방법을 알아낼 수 있으면 업데이트하겠습니다.

답변2

zip 명령은 출력 zip 파일에 추가됩니다. 실행 사이에 제거해 보십시오.


업데이트: -X를 직접 테스트했지만 여전히 파일에 파일 타임스탬프를 삽입하는 것 같습니다(그림 참조 unzip -l).

당신이 보면Wikipedia에 대한 계약날짜 및 시간 필드는 항상 존재하며 헤더 끝에는 OS별 필드를 위한 공간이 있음을 알 수 있습니다. -X는 OS에 특정한 추가 필드를 제외한다고 말하고 싶습니다.

따라서 일관된 zip 파일을 생성하는 유일한 방법은 일관된 타임스탬프를 갖는 것이라고 생각합니다. zip 파일에 추가하기 전에 특정 날짜에 파일을 추가해 볼 수 있습니다.

답변3

결국 .gitsha루트 폴더에 저장소를 생성하고 만료된 후에만 다시 작성했습니다. 이것은 내가 원하는 것을 제공합니다. 한 줄의 코드를 20줄로 폭발시키는 대가로..

new_sha=$(git rev-parse HEAD)
if [ -f ../.gitsha ]
then
   old_sha=$(cat ../.gitsha)
   if [ $old_sha = $new_sha ]
    then
    generate=false
    echo "gitsha file up to date"
   else
    generate=true
    echo "gitsha file out of date"
   fi
else
    echo "git sha file missing"
   generate=true
fi

if [ $generate = true ]
    then
    echo $new_sha > ../.gitsha
fi

바꾸다git rev-parse HEAD > .gitsha

관련 정보