54. .
./.git
./.git/branches
./.git/config
./.git/description
./.git/HEAD
./.git/info
./.git/info/exclude
./.git/objects
./.git/objects/info
./.git/objects/pack
./.git/refs
./.git/refs/heads
./.git/refs/tags
앞서 Javascript 변수로 설명한
것들이 파일로 존재한다!
55. git init 명령직후에는 master 파일 내
용에 아무것도 없다
$ cat ./git/HEAD
ref: refs/heads/master
!
$ cat .git/refs/heads/master
cat: .git/refs/heads/master: No such file or directory
!
$ git branch
!
$
!
브랜치 역시 없는 상태
56. 간단히 README 파일을 생성한다
$ echo ‘just created’ README
!
$ ls -la
total 0
drwxr-xr-x 4 andrwj staff 136 11 25 00:18 .
drwxr-xr-x 3 andrwj staff 102 11 25 00:14 ..
drwxr-xr-x 14 andrwj staff 476 11 26 17:21 .git
-rw-r--r-- 1 andrwj staff 0 11 25 00:16 README
!
$ cat README
just created
!
$
현재 폴더에는 READ와
.git 폴더 뿐이다
58. $ cat .git/HEAD
!
ref: refs/heads/master
!!
그러나 여전히 master 파일의 내용은 비어있다
$ cat .git/refs/heads/master
cat: .git/refs/heads/master: No such file or directory
!!!
$ cat .git/object/4e/8238248ad38d598515adb865b818ec9381f967
!
x??Q
B!???????
??-?ied?]??
?;03K??
@???9Cd?9%t?I???Ή?(J+B?%e4?=n???
??L?s?^k(?????!???zkͤs3?߂????????/?
생성된 긴 이름의 파일을 출력해보니
TEXT 포맷의 파일이 아님을 알수있다
59. git blob format
헤더 정보를 포함하여 zlib로 압축되어 저장된다
헤더 형식: “blob 원본파일크기 null”
60. blob format
$ cd .git/object/4e/
$ python
fd = open(“8238248ad38d598515adb865b818ec9381f967”)
line = fd.read()
import zlib
zlib.decompress(line)
‘blob 13x00just createdn’
객체 종류는
‘blob’ 원본 크기는 13 바이트
null 바이트
원본 내용
61. git hash-object README
$ git hash-object README
4e8238248ad38d598515adb865b818ec9381f967
!
$ git cat-file -p 4e8238
just created
파일이름으로 해쉬명을 알 수 있다
파일이름 몇글자로
내용을 출력할 수 있다
62. why hash ?
내용에 따라 중복된 이름이 나올 가능성이 극히 드물다
육안으로 분별하기 힘든 차이도 쉽게 검출 가능하다
번호로된 파일 이름보다 관리 하기 쉽다(?)
파일명이 변경되어도 내용이 같으면 동일한 것으로
인식한다.
63. README
!
‘just created’
README
!
‘just created ‘
$ cat README
!
‘just created’
!!
끝부분 공백도 명확히 알 수 있다
$ git hash-object README
!
ec53c2432a2e9c2fadaa9d5982bd3cf31f9b38d2
!
$ cat README
!
‘just created ’
!!
$ git hash-object README
!
a6014d70c71eab934f3ac1248f8bad19ad3d451c
!
68. var blob = “헤더+내용이 zlib 로 압축된 문자열”;
!
var Tree = [
blob,
Tree,
];
!
var Commit = {
Javascript로 표현 ...
parent: { },
tree: [ ],
author: “string”,
date: “2011/11/30”
};
!
var Tag = “커밋을 가리키는 문자열”
69. blob object
Blob
header + content
!
zlib로 압축되어 있다
!
.git/objects/ 아래 있다
70. tree object
Tree
blob + 다른 tree 객체
!
‘폴더’와 같은 개념
!
.git/objects/ 아래 있다
71. commit object
Commit
blobs + trees + author
+ date + message
!
.git/objects/ 아래 있다
72. tag object
Tag
pointer to commit object
!
.git/refs/tags/ 아래있다
73. B
BB
T
TBT T
TBT T
prev
author
date
message
BTT TBT
Tag
BBB
prev
author
date
message
T
TBT T
TBT T
TBT
BBB
prev
author
date
message
T
TBT T
TBT T
TBT
Tag
BB
BT HEAD
master
예를 들자면...
74. 중간 정리
파일은 blob 포맷으로 저장된다.
폴더는 tree 객체로, 파일은 blob 객체로 표현된다.
commit, tag 역시 객체로 취급되어 파일형태로 저장된다.
모든 파일은 SHA 방식의 해쉬로 표현된다.
Git의 branch와 commit 은 pointer 이다.
75. three spaces
- Working area
!
- Staging or Index
!
- Local Repository
79. Repo
!R
Working Staging
EADME
$ cat ‘just created’ README
과정1 /11 - 처음으로 커밋할 파일을 생성
80. Repo
!R
Working Staging
EADME
$ cat README
just created
과정2 /11 - 파일 내용 보기
81. !
Repo
!R
Working
EADME
!R
Staging
EADME
$ git add README
스과테정이3 징/1 영1역 -에 스 파테일이 징정 보영 역기에록
파일 정보 기록
‘README’ 파일은 blob 형식으로 변환되어
.git/object/ 아래에 저장됨
82. !
Repo
!R
Working
EADME
!R
Staging
EADME
$ git ls-files -s
100644 4e8238248ad38d598515adb865b818ec9381f967 0 README
!
과정4 /11 - 스테이징 영역의 파일 정보 열람
(.git/index 파일 내용을 참조)
83. !
Repo
!R
Working
EADME
!R
Staging
EADME
$ ls -la .git/object/4e
drwxr-xr-x 3 andrwj staff 102 11 26 17:37 .
drwxr-xr-x 7 andrwj staff 238 11 26 18:06 ..
-r--r--r-- 1 andrwj staff 29 11 26 17:37 8238248ad38d598515adb865b818ec9381f967
과정5 /11 - ‘commit’ 단계에서 파일이 저장되는 것이 아니라,
‘add’ 단계에서 이미 저장되어 있는 것이
subversion 과 다른점!
84. !
Repo
!R
Working
EADME
!R
Staging
EADME
$ cat .git/index
??~?){???e?쓁?gREADME'mh?$
과정6 /11 - .git/index 파일은 TEXT 형식의 파일이 아
님.
85. !
!
Repo
!R
Working
EADME
!R
Staging
EADME
$ git commit -m ‘first commit’
[master (root-commit) b3d38eb] first commit
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 README
!R
C1: b3d38eb
EADME
!
과정7 /11 - 이미 README 저장되어 있으므로
‘commit’ 단계에선 스테이징 영역의 리스트를 참조
하여 commit object를 만든다
88. !
!
Repo
!R
Working
EADME
!R
Staging
EADME
!R
C1: b3d38eb
EADME
!
$ git cat-file -p b3d38eb6591fc4737509a00471e9a64ba4f79c5c
tree b529edd1315d7d85716378eb7829ba0772542851
author AJ andrwj@gmail.com 1322298365 +0900
committer AJ andrwj@gmail.com 1322298365 +0900
과정10 /11 - 커밋객체(파일)의 내용을 출력해보면
tree 객체와 커밋한 사용자와 날짜 및
커밋 메세지를 볼 수 있다.
89. !
!
Repo
!R
Working
EADME
!R
Staging
EADME
!R
C1: b3d38eb
EADME
!
$ file . -name ‘*d38eb6591fc4737509a00471e9a64ba4f79c5c’
./.git/objects/b3/d38eb6591fc4737509a00471e9a64ba4f79c5c
과정11 /11 - 커밋객체(파일) 역시 .git/objects/ 폴더 아래에 있다.