Git 팩파일 뷰어 (.pack / .idx)
.pack과 .idx를 브라우저에서 읽어 객체마다 종류·크기·오프셋·델타 깊이와 베이스, 종류별 합계와 가장 큰 객체를 보여 줍니다.
사용법
- .git/objects/pack/ 안에서 이름이 같은 두 파일, 즉 pack-<해시>.pack과 pack-<해시>.idx를 찾습니다.
- 두 파일을 함께 끌어다 놓거나 한 번에 선택합니다. 기본 이름으로 짝을 지어 이 탭 안에서 읽습니다.
- 요약부터 봅니다. 객체 수, 델타 비율, 가장 깊은 체인, 그리고 .idx가 저장한 체크섬이 .pack 끝의 체크섬과 맞는지가 나옵니다.
- "종류별 객체"와 "가장 큰 객체"로 공간이 어디로 갔는지 봅니다. 표의 객체 id를 복사해 저장소에서 git cat-file -p로 확인할 수 있습니다.
- 팩이 너무 커서 브라우저에 넘기기 어렵다면 .idx만 놓으세요. id와 CRC32와 오프셋은 모두 인덱스에 있고 객체당 약 26바이트뿐입니다.
자세한 설명
펼치기접기
팩파일은 git이 수많은 객체를 한 파일에 모아 두는 방식이고, 옆에 있는 .idx는 그 안으로 들어가는 지도입니다. 256칸짜리 팬아웃 표, 오름차순으로 정렬된 객체 id, 각 객체의 CRC32와 시작 오프셋이 들어 있습니다. 두 파일을 함께 놓으면 이 페이지는 git verify-pack -v가 보여 주는 것과 같은 표를 만듭니다. 객체마다 id와 종류, 저장된 크기, 팩에서 차지하는 바이트 수, 오프셋, 델타 깊이, 델타가 기준으로 삼은 객체의 id까지 나오고, 저장소가 왜 커졌는지 답하는 합계가 더해집니다. 종류별 개수와 압축 후 바이트, 델타 비율, 체인의 깊이, 그리고 가장 큰 객체들입니다.
압축은 전혀 풀지 않으며 풀 필요도 없습니다. 각 오프셋의 헤더에 종류와 저장 크기가 평문으로 들어 있고 델타의 베이스도 바로 뒤에 평문으로 따라오며, 객체가 차지하는 바이트 수는 다음 오프셋까지의 거리일 뿐입니다. 다만 표를 읽기 전에 알아 둘 점이 있습니다. 델타 객체의 크기는 복원된 객체가 아니라 델타 자체의 크기입니다. git도 같은 이유로 같은 숫자를 찍습니다.
두 파일 어디에도 적혀 있지 않아 배치로만 알아내야 하는 것이 둘 있습니다. SHA-256 저장소임을 알리는 표시가 없으므로 20바이트와 32바이트를 모두 시도해 각 구간이 끝의 체크섬 두 개에 정확히 닿는 쪽을 씁니다. 그리고 32비트 오프셋의 31번 비트는 "2GiB를 넘었다"는 뜻이 아니라 뒤에 따라오는 64비트 오프셋 표의 색인이라는 뜻입니다. 이 비트를 무시하면 그럴듯하지만 틀린 오프셋이 나옵니다.
한 파일만 있어도 할 말은 있습니다. .idx만 있으면 id와 CRC32와 오프셋을 얻을 수 있고, 이는 팩에 비해 아주 작습니다. .pack만 있으면 서명과 버전과 객체 수까지만 알 수 있습니다. 오프셋이 없으면 한 객체가 어디서 끝나는지 알 수 없기 때문입니다. 두 파일이 모두 있을 때 압축을 풀지 않고 할 수 있는 유일한 검증은 .idx가 저장한 팩 체크섬이 .pack 끝의 체크섬과 같은지 보는 것이고, 이 결과와 함께 잘린 팩, 감소하는 팬아웃, 모르는 인덱스 버전, 파일 밖을 가리키는 델타 베이스도 이름을 붙여 알려 줍니다.
알 수 없는 것도 있습니다. 팩에는 경로 이름이 없어서 큰 blob이 어느 파일인지 여기서는 알 수 없습니다. 이름은 tree 객체 안에 있고 그것은 압축을 풀어야 나옵니다. 객체가 온전한지도 증명하지 못합니다. 그것은 git verify-pack이 하는 전체 압축 해제와 해시 계산이 필요합니다. 버전 1 인덱스도 읽지만 CRC32 열은 비어 있습니다. 버전 2 이전에는 git이 저장하지 않았기 때문입니다.
자주 묻는 질문
델타 객체의 크기가 왜 이렇게 작나요?
복원된 객체가 아니라 델타 자체의 크기이기 때문입니다. 델타 객체는 다른 객체를 이 객체로 바꾸는 지시, 즉 베이스의 어느 구간을 복사하고 어떤 바이트를 새로 넣으라는 명령만 담고 있으며 헤더의 크기는 그 명령 스트림의 길이입니다. git verify-pack -v도 같은 이유로 같은 값을 출력합니다. 복원 후 크기는 압축된 델타 데이터 안에 적혀 있어서 압축을 풀어야만 알 수 있고, 이 페이지는 일부러 풀지 않습니다.
ofs-delta와 ref-delta는 무엇이 다른가요?
둘 다 델타를 저장하지만 베이스를 가리키는 방법이 다릅니다. ofs-delta는 자기 오프셋에서 뒤로 몇 바이트인지를 적어 짧고 자족적이며, ref-delta는 베이스의 전체 객체 id를 적어 20바이트나 32바이트를 쓰고 조회가 필요합니다. git은 1.5부터 기본으로 ofs-delta를 쓰고, repack.useDeltaBaseOffset을 false로 두는 등 아주 오래된 클라이언트를 배려할 때나 베이스가 이 팩에 아예 없을 때만 ref-delta를 씁니다. 후자는 fetch 중에 오가는 thin 팩의 모습입니다.
델타 체인이 길면 문제인가요?
득실의 문제입니다. 체인 길이는 객체 하나를 되살리려고 델타를 몇 번 이어서 적용해야 하는지를 뜻하므로 깊이가 50이면 그 객체 하나를 읽는 데 51개 객체를 건드립니다. 체인이 깊으면 더 작게 저장되고 더 느리게 읽히며, git은 repack의 --depth로 이를 제한합니다. 기본값은 50입니다. 대부분의 객체가 깊이 0이라면 델타 압축이 별 도움이 되지 않은 것이고, 보통 이미지나 압축 파일처럼 이미 압축된 내용이 그 원인입니다.
어떤 큰 파일이 저장소를 채우는지 알 수 있나요?
이름으로는 알 수 없습니다. 팩은 경로가 아니라 객체를 담습니다. blob에는 이름이 없고 파일 이름은 tree 객체 안에 있으며 그것도 압축되어 있습니다. 이 페이지가 주는 것은 가장 큰 객체의 id이고, 거기서부터는 저장소에서 git rev-list --objects --all로 경로를 찾거나 git cat-file -p로 내용을 볼 수 있습니다. id에서 크기로, 다시 경로로 가는 이 순서가 "왜 클론이 2GB인가"를 밝히는 일반적인 방법입니다.
왜 .idx가 필요한가요? 팩만 훑으면 안 되나요?
압축을 풀지 않고는 안 됩니다. 객체는 서로 붙어 있고 압축 데이터의 길이를 적은 칸이 없어서, 하나가 어디서 끝나는지 알려면 zlib 스트림이 끝날 때까지 풀어 보는 수밖에 없습니다. .idx에는 모든 오프셋이 이미 들어 있으므로 팩에서의 크기는 다음 오프셋까지의 거리가 되고 어디서도 압축을 풀 필요가 없습니다. 인덱스가 아예 없는 팩이라면 git도 git index-pack으로 다시 만드는데, 그 명령은 모든 객체의 압축을 풉니다.
.idx와 .pack이 맞지 않는다고 나오는데 무슨 뜻인가요?
인덱스의 마지막 두 해시는 자신이 설명하는 팩의 체크섬과 인덱스 자신의 체크섬입니다. 값이 다르면 두 파일이 함께 만들어지지 않았다는 뜻입니다. 보통 서로 다른 곳에서 복사되었거나 한쪽만 다시 만들어진 경우이고, 그러면 인덱스의 오프셋이 엉뚱한 바이트를 가리켜 이후의 종류와 크기가 모두 무의미해집니다. 해결책은 그 짝을 믿지 않는 것입니다. 팩을 다시 받거나 git index-pack으로 인덱스를 다시 만드세요.
관련 도구
WebAssembly 모듈 인스펙터
브라우저에서 .wasm 파일을 분석합니다. 섹션 크기, 타입까지 포함한 임포트와 익스포트, 메모리 페이지, start 함수, name과 producers 섹션을 보여줍니다.
개발
GIF 구조 분석기
GIF 파일의 블록 구조를 그대로 읽어 프레임 지연과 폐기 방식, 반복 설정, 팔레트, 투명도, 프레임별 실제 바이트 비용까지 보여줍니다.
이미지
PKCS#12 키스토어 분석기
.p12/.pfx를 브라우저에서 엽니다. 비밀번호 없이 MAC과 암호 알고리즘을, 입력 후에는 인증서 체인·개인 키·키 일치 여부를 보여줍니다.
개발
.gitignore 테스터
.gitignore와 경로 목록을 붙여넣으면 어떤 경로가 무시되는지, 그리고 몇 번째 줄이 그렇게 결정했는지 git check-ignore -v처럼 보여줍니다.
개발
.gitattributes 테스터
.gitattributes와 경로 목록을 붙여넣으면 각 경로에 최종 적용되는 모든 속성과, 그 값을 정한 줄 또는 매크로를 보여줍니다.
개발
CRL 디코더 (X.509)
인증서 폐기 목록을 브라우저에서 읽습니다. 발급자, CRL 번호, 유효 구간, 폐기된 일련번호와 사유, 서명 검증까지.
개발