나는 대답을 확장하고 제공 @Leif Gruenwoldt
하는 참조에 무엇이 있는지 자세히 설명 하고 있습니다.@Leif Gruenwoldt
스스로 해..
- 1 단계. 저장소에 빈 텍스트 문서 (이름은 중요하지 않음)를 만듭니다.
- 2 단계. 문서 준비 및 커밋
- 3 단계. 다음을 실행하여 Blob의 해시를 식별합니다.
git ls-tree HEAD
- 4 단계. blob의 해시를 찾습니다.
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
- 5 단계. 놀라움에서 벗어나 아래를 읽어보세요.
GIT는 커밋 해시를 어떻게 계산합니까?
Commit Hash (SHA1) = SHA1("blob " + <size_of_file> + "\0" + <contents_of_file>)
텍스트 blob⎵
는 상수 접두사이며 \0
상수이며 NULL
문자입니다. <size_of_file>
및 <contents_of_file>
파일에 따라 달라집니다.
참조 : git commit 객체의 파일 형식은 무엇입니까?
그리고 그게 다야!
하지만 기다려! , <filename>
해시 계산에 사용되는 매개 변수가 아님 을 눈치 챘습니까? 두 파일의 내용이 생성 된 날짜 및 시간과 이름에 관계없이 동일한 경우 잠재적으로 동일한 해시를 가질 수 있습니다. 이것이 Git이 다른 버전 제어 시스템보다 이동 및 이름 변경을 더 잘 처리하는 이유 중 하나입니다.
스스로해라 (Ext)
- 6 단계. 다른 빈 파일을 만듭니다.
filename
동일한 디렉토리에
- 단계 7. 두 파일의 해시를 비교합니다.
노트 :
링크는 tree
객체가 해시되는 방법을 언급하지 않습니다 . 나는 알고리즘과 매개 변수에 대해 확신하지 못하지만 내 관찰에서 아마도 포함 된 모든 blobs
및 trees
(아마도 해시)를 기반으로 해시를 계산합니다.