Git 객체 ID 계산기 (hash-object)
blob·tree·commit·tag의 git 객체 ID를 SHA-1과 SHA-256으로 계산하고, git이 해시하는 헤더와 루스 객체 경로까지 보여줍니다.
사용법
- 종류를 blob으로 둔 채 내용을 입력하면 SHA-1과 SHA-256 ID가 나옵니다. 옵션 없는 git hash-object와 같습니다.
- 본문을 파일로 바꾸면 디스크의 파일을 줄바꿈 변환 없이 바이트 그대로 해시합니다.
- 이진 데이터는 16진수로 넣으세요. 모드·이름·NUL·원시 ID로 이루어진 트리 본문도 마찬가지입니다.
- 이미 가진 객체 본문을 해시하려면 commit이나 tag를 고르세요. git hash-object -t commit --literally와 같습니다.
- 재현하려는 ID를 기대 ID 칸에 붙여넣으면 축약만으로도 비교하고, 어느 알고리즘이 맞았는지 알려 줍니다.
자세한 설명
펼치기접기
git hash-object가 하는 일을 브라우저 탭에서 합니다. git 객체의 이름은 내용의 해시가 아닙니다. 종류, 공백, 바이트 수, NUL 한 바이트, 그리고 내용을 이어 붙인 것의 해시입니다. 파일을 그냥 sha1sum 해도 git이 보여 주는 ID와 절대 같지 않은 이유가 이것입니다. 두 ID를 모두 표시합니다. 기본 설정으로 만든 저장소는 SHA-1로, object-format sha256으로 만든 저장소는 SHA-256으로 객체 이름을 정하며, 두 이름 공간은 서로 변환되지 않습니다. 헤더와 그 바이트를 화면에 띄우므로 규칙을 믿는 대신 읽어 볼 수 있고, 알아 두면 좋은 상수도 나옵니다. 빈 blob은 언제나 e69de29bb2d1d6434b8b29ae775ad8c2e48c5391, 빈 트리는 언제나 4b825dc642cb6eb9a060e54bf8d69288fbee4904입니다. ID는 종류와 길이, 바이트만 담기 때문에 파일 이름과 모드는 들어가지 않습니다. 그 둘은 blob을 가리키는 트리 항목에 있고, 그래서 저장소 어디에 있든 내용이 같은 두 파일은 하나의 객체를 공유합니다. 끝의 줄바꿈도 내용이라 ID가 바뀌고, CRLF도 그렇습니다. 로컬에서 구한 ID가 git과 어긋나는 흔한 이유가 바로 이것입니다. core.autocrlf나 text 속성이 걸려 있으면 git이 저장하는 blob은 LF인데 디스크의 파일은 CRLF이므로, 본문에 CRLF가 보이면 경고합니다. 트리 본문은 이진 데이터(모드, 공백, 이름, NUL, 원시 20바이트 ID)이므로 텍스트가 아니라 16진수로 넣습니다. 재현하려는 ID를 붙여넣으면 전체든 축약이든 두 결과와 비교해 줍니다.
자주 묻는 질문
sha1sum 결과가 왜 다른가요?
git은 먼저 헤더를 해시하기 때문입니다. 해시 입력은 객체 종류, 공백, 본문 바이트 수, 0 바이트, 그다음 본문입니다. 같은 파일의 sha1sum과는 완전히 다른 값이 나옵니다. 헤더를 직접 붙여 계산하면(printf 'blob 11\0hello world' | sha1sum) 값이 일치합니다.
파일 이름이 ID를 바꾸나요?
아닙니다. blob은 내용일 뿐입니다. 같은 파일이 스무 곳에 있어도 객체는 하나만 저장되고, 이름만 바꿔도 새 blob이 생기지 않는 이유입니다. 이름과 모드, 디렉터리 구조는 트리 객체에 있고 커밋은 그 트리를 가리킵니다. 두 파일의 ID가 같다면 바이트 단위로 같은 파일입니다.
같은 파일인데 git이 보여 주는 ID와 왜 다른가요?
대개 줄바꿈입니다. 윈도에서 core.autocrlf가 true거나 .gitattributes에 text 속성이 있으면 git이 들어올 때 CRLF를 LF로 바꾸므로, 저장된 blob은 디스크의 바이트가 아닙니다. clean 필터나 ident 속성도 같은 효과를 냅니다. 여기서 파일을 해시하면 지금 존재하는 파일의 ID가 나오고, git rev-parse HEAD:경로는 저장된 것의 ID를 줍니다.
SHA-256 저장소는 어떻게 되나요?
git init --object-format=sha256으로 만들면 같은 헤더+본문 입력을 SHA-256으로 해시해 64자 ID를 씁니다. 규칙의 나머지는 그대로이고, 그래서 여기서 두 ID를 함께 보여 줍니다. 두 이름 공간은 호환되지 않으므로 SHA-1 저장소의 ID를 변환할 수는 없고, 옮기려면 객체를 다시 써야 합니다.
SHA-1이라 문제가 되지 않나요?
SHA-1 충돌은 2017년부터 실제로 만들어졌고, git의 대응은 모든 ID를 바꾸는 대신 내부 해시를 알려진 공격 패턴을 감지해 입력을 거부하는 강화판으로 바꾸는 것이었습니다. 평범한 파일에서는 강화판과 평범한 SHA-1이 같은 값을 내므로 여기 값이 git과 일치하고, 차이는 일부러 만든 충돌 쌍에서만 드러납니다. 여유를 원하는 저장소는 SHA-256 객체 형식을 씁니다.
관련 도구
해시 생성기 (SHA)
텍스트로 SHA-1·SHA-256·SHA-384·SHA-512 해시를 생성하세요.
개발
파일 해시 (체크섬)
어떤 파일이든 SHA-1·SHA-256·SHA-512 체크섬을 계산하세요.
파일
DNSSEC 계산기 — DS 레코드와 NSEC3 해시
DNSKEY를 등록기관이 요구하는 DS 레코드로 바꿉니다. 키 태그와 세 가지 다이제스트 종류 전부, 또는 NSEC3 방식으로 이름을 해시합니다.
네트워크
파일 해시 검증
파일 드롭 + 기대 SHA-1/256/384/512 붙여넣기 → 실제 해시 일치 검증. 다운로드한 바이너리 설치 전에 유용.
파일
CSP 해시 생성기
Content-Security-Policy로 화이트리스트하려는 인라인 <script>·<style>의 sha256/384/512 base64 해시 계산.
네트워크
Conventional Commit 메시지 빌더
타입, 스코프, 호환성 깨짐, 푸터가 포함된 Conventional Commits 메시지를 브라우저에서 만듭니다.
개발