2017-10-29 8 views
1

필자의 자동화 된 빌드가 디렉토리의 내용을 압축해야하고 Sha256sum이 zip 파일을 필요로하는 문제가 있습니다. 충분히 쉬워.파일 내용이 변하지 않아도 git clone 후에 zip 파일의 Sha256 해시가 다른가요?

그러나, 자동화 된 빌드의 다음 실행은 소스 코드가 변경되었는지 여부를 확인하기 위해 zip 파일을 같은 내용을 압축하여 Sha256sum 할 필요가있다. 로컬

나는 다음과 같은 명령을 실행하고 (필자는 코드의 변경되지 않은으로 예상) 같은 해시마다 우편을 생성했습니다

zip -q -r -X my-directory.zip my_directory/* --exclude ".gitignore" "requirements.txt" "*__pycache__/*" "*/\infrastructure/*" 
sha256sum my-directory.zip | awk '{ print $1 }' > my-directory.zip.hash 
cat my-directory.zip.hash 

내 빌드가 같은 명령을 실행 하지만 각 실행의 시작 부분에서 GitHub에서 코드 체크 아웃을하고 있습니다 (빌드가 도커 컨테이너 내에서 실행됨에 따라) 코드 변경없이 다른 해시가 발생합니다.

나는 repo를 삭제하고 다시 복제함으로써 문제를 로컬에서 다시 만들었습니다.

아이디어가 있으십니까? 나는 그것이 메타 데이터 또는 일종의 생각이지만 행운없이 다른 제외 명령을 시도했다.

+0

bytewise 동일한 zip 파일을 생성하기 위해 다른 zip 구현을 기대하지 않습니다. 다른 압축 설정 또는 최적화, 파일 순서, 메타 데이터 일 수 있습니다 ... –

답변

0

현재 방법이 오류가 발생하는 경향이 있습니다. 주의 깊게 구성된 --exclude 매개 변수 에 의존하며 예기치 않은 파일이 없다고 가정합니다. 아주 약해.

더 좋은 방법은 우편을 만들기 위해 git archive 명령을 사용하는 것입니다 :

git archive HEAD -o my-directory.zip my_directory 

이 무시 파일 및 기타 파일 저장소의 일부를 무시합니다. 일관된 결과를 보장해야합니다.

참고 그러나 그 git archive는 주석으로 커밋 ID를 추가합니다. 어떤 이유로 당신이를 제거하려면 ,이 추가 명령을 실행하여 수행 할 수 있습니다 : --exclude을 통해

zip -z my-directory.zip < /dev/null 
+0

감사. 다음 git archive 명령을 사용하고 있습니다 :'git archive HEAD --worktree-attributes -o my-archive.zip my-archive /'...하지만 매번 다른 해쉬를 얻고 있습니다. 커밋 ID가 zip 파일에 주석으로 저장되어 있기 때문입니다. 나는 성공하지 못한 채 다음을 시도했다 :'git archive HEAD^{tree} --worktree-attributes -o my-archive.zip my-archive /'. 어떤 아이디어? –

+0

@AlistairWebster 해당 유스 케이스를 처리하기 위해 내 대답이 업데이트되었습니다. – janos

0

수동으로 제외 패턴은 안정적인 될 것 같지 않습니다. 또한 .git 폴더를 제외하지는 않으며 zip 파일에는 포함되어 있지 않지만 어느 정도 해시를 방해 할 수 있습니다.

당신은 제대로 .gitignore 파일을 구성하고 git archive를 사용해야합니다. git 저장소에서 파일을 내보내는 가장 좋은 방법입니다.

시도는 이런 방식으로 워크 플로우를 변경하려면 :

git archive HEAD -o project-archive.zip 
sha256sum project-archive.zip | awk '{ print $1 }' > project-archive.zip.hash 

당신은 예상 결과를 얻을 수 있습니다.