objects 파일명의 원리/commit의 원리
27 Jan 2019
|
github
지옥에서 온 git
objects 파일명의 원리
- 내용을 기반으로 파일의 이름이 결정되는 메카니즘이 무엇을 사용하는지에 대한 소개
- google에서
sha1 online
검색
hi
를 쳐서 hash
를 누르면 어떤 숫자들이 뜸
- 입력된 문자는
hash
라는 메카니즘을 통과하면 어떤 숫자들이 생성됨
- 즉, git은 sha1 이라는 hash 알고리즘을 통과해서 그 파일의 이름을 도출한 다음(임의의 hash 값들), 앞의 두 글자를 따서 디렉터리를 만들고,
나머지 hash 코드에 해당하는 파일에 저장 되게 됨.
commit의 원리
- 현재
git status
를 해보면 생성된 f1,f2,f3.txt
파일이 뜸.
git add
후 git 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를 갖고있음