후속작입니다같은 폴더에 파일을 반복해서 압축하는데 샤섬이 계속 바뀌네요본질적으로..
저장소의 일부를 압축하여 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
strings
zip 파일에서 명령 출력을 확인합니다.
$ 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