objects 파일명의 원리/commit의 원리

|

objects 파일명의 원리

  • 내용을 기반으로 파일의 이름이 결정되는 메카니즘이 무엇을 사용하는지에 대한 소개
  • google에서 sha1 online 검색
  • hi를 쳐서 hash를 누르면 어떤 숫자들이 뜸
    • 입력된 문자는 hash라는 메카니즘을 통과하면 어떤 숫자들이 생성됨
  • 즉, git은 sha1 이라는 hash 알고리즘을 통과해서 그 파일의 이름을 도출한 다음(임의의 hash 값들), 앞의 두 글자를 따서 디렉터리를 만들고, 나머지 hash 코드에 해당하는 파일에 저장 되게 됨.

commit의 원리

  • 현재 git status를 해보면 생성된 f1,f2,f3.txt 파일이 뜸.
  • git addgit commit을 하고 커밋메세지 작성 후 gistory 확인
  • 생성된 objects/~ 정보를 보면 방금 한 커밋 정보가 objects 디렉터리 안에 저장됨(버전, 파일 정보 모두)
  • 즉, 커밋도 내부적으로는 객체라고 볼 수 있음
  • 커밋 안에는 커밋 저자 정보, 커밋 내용 정보, 그리고 tree object정보가 적혀있음.
    • 해당 object정보를 보면, 각각 방금 커밋 한 파일의 버전에 해당하는 이름과 내용 정보를 볼 수 있음.
  • f2.txt의 내용을 바꾼 후, git add 하고 gistory를 확인
    • gistory에서 index 파일에 objects/~에서 변경된 f2.txt내용 확인 가능
    • 해당 객체의 sha1 id대로 index 파일 안에 f2.txt파일의 id만 변경된 것을 확인 가능
  • git commit 후 gistory 확인 해보면, 커밋이 담겨있는 객체가 생성 된 것을 확인 가능
    • 눌러보면 커밋 메세지와 tree sha_id번호, 저자정보 등의 내용이 뜸
    • 여기에, 아까는 없던 parent sha_id번호가 생성됨
    • parent id를 보면, 해당 커밋의 이전 커밋 내용이 뜸
    • tree 내용이 두개 적혀있는데, 현재와 이전 커밋의 tree 값이 서로 다름
    • 첫 번째 tree 값을 클릭하면 f2.txt의 트리 값을 누르면 이전 내용이 뜸
    • 두 번째 tree 값을 클릭하면 최신 내용이 뜸
  • 커밋에는 두 가지 중요 정보가 있음
    • 이전 커밋이 누구인가(parent 값이 존재)
    • 그 커밋이 일어난 시점에 작업 디렉터리 파일의 이름과 이름이 담고 있는 내용 사이의 정보가 tree에 담겨있음
  • 각각의 버전마다 서로 다른 tree를 가리키고 있고, 해당 tree에는 파일의 이름과 내용이 각각 link 되어있음
  • 버전에 적혀있는 tree를 통해 버전이 만들어진 시점에 프로젝트 폴더에 대한 상태를 얻어 낼 수 있음
    • 이를 snapshot이라고 함.
    • 각각의 버전은 만들어진 시점의 snapshot을 tree라는 구조를 통해 갖고있게 됨
  • mkdir d1으로 새 디렉터리를 만들고, f1.txt를 새로 만든 폴더에 복사
  • d1 폴더 내의 복사된 파일을 git add
  • 다음으로 gistory로 확인해보면, index 안에 d1/f1.txt가 생성된것을 확인 가능
  • git commit으로 커밋 하고 gistory로 확인해보면 parent 정보 확인 가능하며, 각 parent는 tree를 갖고 있어 해당 시점의 정보가 담겨있음

정리

  • object 파일은 크게 세 가지로 나뉨
    • blob: 파일의 내용을 담고 있음
    • tree: 파일명과 그 파일명의 내용에 해당하는 blob의 정보를 담고 있음
    • commit: object id를 갖고있음