Internal

  • .git 의 내부 구조

/objects

objects 디렉터리는 실제 파일 안의 내용을 SHA-1 로 해시한 값에서 앞의 2자리를 폴더명으로, 나머지 38 자리를 파일 명으로 두어 식별자 형태로 사용한다.

blob, tree, commit

/objects 에 저장 되는 파일의 형태는 크게 blob, tree, commit 으로 구분된다.

  • blob
    • 소스 코드, 이미지 등 다양한 파일의 데이터를 저장
    • 파일의 메타데이터는 저장하지 않고 데이터 자체만 저장
    • 따라서, 동일한 소스 코드를 가진 파일이 여러개 있더라도 blob 파일은 하나만 생성 됨
  • tree
    • 폴더 구조를 git 에서도 관리할 수 있게 해줌
    • 파일 식별자, 파일 데이터의 해시값, 파일의 이름이 저장
    • tree 는 blob 과 또 다른 tree 로 구성
      • 100644(읽기 파일 blob)
      • 100755(실행 파일 blob)
      • 040000(디렉터리 tree)
  • commit
    • 각각의 커밋별로 하나의 커밋 파일로 저장됨
    • tree, parent, author, commiter, commit message 정보가 담김
    • parent 는 해당 commit 바로 이전의 상위 commit id 로, Linked List 형태로 커밋들이 구성됨

/refs

  • git 에서 관리하는 branch 정보를 관리
  • heads
    • 로컬에서 작업하는 부분
  • remotes
    • 원격 저장소
    • HEAD 에 각 브랜치별 마지막 커밋 해시값을 저장

/logs

  • HEAD, 각각의 브랜치 별로 작업 목록의 로그로 기록됨

/hooks

  • git 에서 지원하는 기본적인 hook 들이 정의 되어 있음

SHA-1 에서 SHA-256 으로

There is no contradiction. Linus himself said in that same talk:

If I have those 20 bytes, I can download a git repository from a completely untrusted source and I can guarantee that they did not do anything bad to it

SHA-1 을 사용하는 배경은 다음과 같다.

At its core, the Git version control system is a content addressable filesystem. It uses the SHA-1 hash function to name content.

컨텐츠를 처리하기 위해 해시 함수를 사용했을 때의 이점은 다음과 같다.

  • Integrity checking is easy
    • 무결성 검사가 쉽다.
    • 파일의 내용이 조금만 변경되더라도 해시값이 달라지기 때문이다.
  • Lookup of objects is fast
    • 개체 조회가 빠르다.

암호화로 안전한 해시함수를 사용했을 때의 이점은 다음과 같다.

  • Object names can be signed and third parties can trust the hash to address the signed object and all objects it references.
  • Communication using Git protocol and out of band communication methods have a short reliable string that can be used to reliably address stored content.

하지만 2017년 2월 31일 SHAttered Attack, 에서 실용적인 SHA-1 해시 충돌을 보여줬고, SHA-1 에 대한 취약점이 발견되면서, Git 2.13.0 이상의 버전에서는 SHAttered Attack 에 취약하지 않은 SHA-1 구현으로 이동했으며, Git 2.29 버전 부터는 SHA-256을 지원 한다고 한다.

Announcing the first SHA1 collision 구글과 네덜란드 CWI 연구소에서 SHA-1 해시 함수의 충돌쌍을 생성하는 서비스를 공개한 적도 있다.