[Hello world]git internal
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
7,527
On Slideshare
1,018
From Embeds
6,509
Number of Embeds
11

Actions

Shares
Downloads
56
Comments
0
Likes
7

Embeds 6,509

http://helloworld.naver.com 6,213
http://www.hanrss.com 191
http://hellosam.new21.net 54
http://collab.lge.com 38
http://clm.lge.com 5
http://cafe.naver.com 2
http://131.253.14.98 2
http://lgekrhqms03.lge.com 1
http://mail.nhncorp.com 1
http://translate.googleusercontent.com 1
http://www.google.co.kr 1

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. GIT INTERNAL 부제: Git 만드는 법12년 8월 23일 목요일
  • 2. 기본 - GIT 저장소 읽고 쓰기 커밋하고 커밋한 것 읽기12년 8월 23일 목요일
  • 3. GIT STORAGE • Git 저장소 = Git Object 저장소 • Git Object = Key-Value pair • Value = Blob(파일), Tree(디렉토리), Commit, Tag • Key = Value에 대한 160bit SHA-1 hash값 (이하 sha1sum)12년 8월 23일 목요일
  • 4. GIT STORAGE 만드는 법 • mkdir -p .git/objects • mkdir -p .git/refs • echo ref: refs/heads/master > .git/HEAD12년 8월 23일 목요일
  • 5. GIT OBJECTS • Blob (파일) • Tree (디렉토리) • Commit (저자정보, 날짜, 커미터 정보, 커밋 메시지 등) • Tag12년 8월 23일 목요일
  • 6. BLOB “blob” <SP> content-length <NUL> content12년 8월 23일 목요일
  • 7. BLOB의 예 blob
  • 8.   17welcome
  • 9.   to
  • 10.   n4wiki12년 8월 23일 목요일
  • 11. TREE "tree" <SP> content-length <NUL> 1*(("100644"|”40000”) <SP> name <NUL> sha1sum-bin)12년 8월 23일 목요일
  • 12. TREE의 예 100644
  • 13.   blob
  • 14.   8e8d68219f81ce69ecb502e43539754770ff0176
  • 15.    DeveloperGuide.md 040000
  • 16.   tree
  • 17.   78ee1e687641a9d3aa6afaf6c82fb86fab744a4d
  • 18.    api 100644
  • 19.   blob
  • 20.   34b3f62387daf615948ecaf62d3cdee263df6a20
  • 21.    i18n.md 040000
  • 22.   tree
  • 23.   dbad3d4da10843b1d666feffa58b0319a8a346b3
  • 24.    spec 040000
  • 25.   tree
  • 26.   17bbf90ac4d32f861227f93eed9dea7c48c279ad
  • 27.    zz.emberjs12년 8월 23일 목요일
  • 28. TREE의 예 tree
  • 29.   178100644
  • 30.   DeveloperGuide.md??h!???i??59uGp?v40000
  • 31.   apix?hvA? Ӫj???/?o?tJM100644
  • 32.   i18n.md4??#???????-<??c?j
  • 33.   40000
  • 34.   spec듣 =MC??f??????F? 40000
  • 35.   zz.emberjs?? ??/??>??|H?y?12년 8월 23일 목요일
  • 36. COMMIT "commit" <SP> content-length <NUL> tree <SP> sha-1 <NEWLINE> parent <SP> sha-1 <NEWLINE> author <SP> name <SP> "<" mail ">" <SP> unixtime <SP> timezone-offset <NEWLINE> committer <SP> name <SP> "<" mail ">" <SP> unixtime <SP> timezone-offset <NEWLINE> <NEWLINE> message12년 8월 23일 목요일
  • 37. COMMIT의 예 commit
  • 38.   252tree
  • 39.   1d0a84f977f13ae6f1b398e0224d40f181725233 parent
  • 40.   a71a8e9cb41ada4ced77c35ec8f2eaa45c64f729 author
  • 41.   Yi
  • 42.   EungJun
  • 43.   <semtlenori@gmail.com>
  • 44.   1345526494
  • 45.   +0900 committer
  • 46.   Yi
  • 47.   EungJun
  • 48.   <semtlenori@gmail.com>
  • 49.   1345526494
  • 50.   +0900 test:
  • 51.   Fix
  • 52.   the
  • 53.   test
  • 54.   for
  • 55.   getTreeHead().12년 8월 23일 목요일
  • 56. GIT OBJECT 저장하는 법 • 내용의 sha1sum을 계산 • 내용을 deflate로 압축 • sha1sum을 이름으로 해서 .git/objects/sha1sum앞2자/ sha1sum나머지38자 파일로 저장12년 8월 23일 목요일
  • 57. LIVE CODING https://github.com/npcode/git-internal-demo12년 8월 23일 목요일
  • 58. REFS • .git/HEAD: 현재 브랜치를 가리킴 • .git/refs/heads/*: 로컬 저장소의 브랜치들 • .git/refs/remotes/*: 원격 저장소의 브랜치들12년 8월 23일 목요일
  • 59. 커밋하는 법 • 커밋할 파일들을 blob으로 저장 • 디렉토리를 tree로 저장 • 루트 디렉토리의 sha1sum, 저자 정보, 커밋 메시지 등을 담은 commit을 저장 • 현재 브랜치 갱신12년 8월 23일 목요일
  • 60. 12년 8월 23일 목요일
  • 61. Hello, World!12년 8월 23일 목요일
  • 62. 8ab68 (greet)12년 8월 23일 목요일
  • 63. 100644 greet 8ab68 8ab68 (greet)12년 8월 23일 목요일
  • 64. 100644 greet 8ab68 8ab68 (greet)12년 8월 23일 목요일
  • 65. c97aa 8ab68 (greet)12년 8월 23일 목요일
  • 66. tree c97aa author Yi committer Yi the first commit! c97aa 8ab68 (greet)12년 8월 23일 목요일
  • 67. tree c97aa author Yi committer Yi the first commit! c97aa 8ab68 (greet)12년 8월 23일 목요일
  • 68. 15c68 c97aa 8ab68 (greet)12년 8월 23일 목요일
  • 69. HEAD refs/heads/master 15c68 c97aa 8ab68 (greet)12년 8월 23일 목요일
  • 70. HEAD refs/heads/master 15c68 c97aa 8ab68 (greet)12년 8월 23일 목요일
  • 71. HEAD refs/heads/master 15c68 c97aa 8ab68 Bye, World! (greet)12년 8월 23일 목요일
  • 72. HEAD refs/heads/master 15c68 c97aa 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 73. HEAD refs/heads/master 15c68 c97aa 100644 greet 02c8f 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 74. HEAD refs/heads/master 15c68 c97aa 100644 greet 02c8f 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 75. HEAD refs/heads/master 15c68 c97aa 8f7bc 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 76. HEAD tree 8f7bc refs/heads/master parent 15c68 author Yi committer Yi 15c68 the second commit! c97aa 8f7bc 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 77. HEAD tree 8f7bc refs/heads/master parent 15c68 author Yi committer Yi 15c68 the second commit! c97aa 8f7bc 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 78. HEAD refs/heads/master 15c68 59866 c97aa 8f7bc 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 79. HEAD refs/heads/master 15c68 59866 c97aa 8f7bc 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 80. HEAD refs/heads/master 15c68 59866 c97aa 8f7bc 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 81. HEAD refs/heads/master 15c68 59866 c97aa 8f7bc 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 82. HEAD refs/heads/master 15c68 59866 c97aa 8f7bc 8ab68 02c8f Bye, World! (greet) (greet)12년 8월 23일 목요일
  • 83. HEAD refs/heads/master 15c68 59866 c97aa 8f7bc 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 84. HEAD refs/heads/master 15c68 59866 c97aa 8f7bc 100644 bye 02c8f 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 85. HEAD refs/heads/master 15c68 59866 c97aa 8f7bc 100644 bye 02c8f 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 86. HEAD refs/heads/master 15c68 59866 c97aa 8f7bc cab01 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 87. HEAD tree cab01 refs/heads/master parent 59866 author Yi committer Yi 15c68 59866 the third commit! c97aa 8f7bc cab01 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 88. HEAD tree cab01 refs/heads/master parent 59866 author Yi committer Yi 15c68 59866 the third commit! c97aa 8f7bc cab01 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 89. HEAD refs/heads/master 15c68 59866 95dfd c97aa 8f7bc cab01 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 90. HEAD refs/heads/master 15c68 59866 95dfd c97aa 8f7bc cab01 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 91. HEAD refs/heads/master 15c68 59866 95dfd c97aa 8f7bc cab01 8ab68 02c8f (greet) (greet)12년 8월 23일 목요일
  • 92. 커밋된 파일 읽는 법 • .git/HEAD 를 읽어서 현재 브랜치를 알아냄 • 현재 브랜치를 읽어서 커밋의 sha1sum을 알아냄 • 커밋을 읽어서 루트 tree의 sha1sum을 알아냄 • 루트 tree를 읽어서 읽고자 하는 blob(파일)의 sha1sum을 알아냄 • blob(파일)을 읽음12년 8월 23일 목요일
  • 93. 고급 - PACK 다루기 packed object 읽기12년 8월 23일 목요일
  • 94. GIT OBJECTS • Loose object - packfile에 들어있지 않은 object • Packed object - packfile에 들어있는 object12년 8월 23일 목요일
  • 95. PACK • You must have around 7,000 loose objects or more than 50 packfiles for Git to fire up a real gc command. • push/pull을 할 때도 packfile을 주고받음 • Documentation/technical/pack-format.txt • https://github.com/schacon/gitbook12년 8월 23일 목요일
  • 96. PACK에서 GIT OBJECT 얻는 법 • 찾고자 하는 object가 .git/objects 에 없으면, • .git/objects/pack/*.idx 를 뒤져서 object가 어느 pack의 어디 에 있는지 알아냄 • 알아낸 곳을 읽고 해석하여 object를 얻음12년 8월 23일 목요일
  • 97. Scott Chacon. (2008). The Community Git Book.12년 8월 23일 목요일
  • 98. Scott Chacon. (2008). The Community Git Book.12년 8월 23일 목요일
  • 99. HEADER “377tOc” - pack signature “0002” - pack version Scott Chacon. (2008). The Community Git Book.12년 8월 23일 목요일
  • 100. FANOUT fanout[i] = sha1sum이 i로 시 작하는 object의 갯수 Scott Chacon. (2008). The Community Git Book.12년 8월 23일 목요일
  • 101. SHA LISTING object들의 sha1sum을 오름 차순으로 나열 Scott Chacon. (2008). The Community Git Book.12년 8월 23일 목요일
  • 102. CRC CHECKSUM object들을 검증하기 위한 4 바이트 checksum Scott Chacon. (2008). The Community Git Book.12년 8월 23일 목요일
  • 103. PACKFILE OFFSETS offset[i] = i번째 object의 packfile 에서의 위치 Scott Chacon. (2008). The Community Git Book.12년 8월 23일 목요일
  • 104. LARGE PACKFILE OFFSETS 4바이트로는 표현이 안되 는 큰 offset들 Scott Chacon. (2008). The Community Git Book.12년 8월 23일 목요일
  • 105. TRAILER packfile과 idxfile의 SHA1 Scott Chacon. (2008). The Community Git Book. checksum12년 8월 23일 목요일
  • 106. Scott Chacon. (2008). The Community Git Book.12년 8월 23일 목요일
  • 107. Scott Chacon. (2008). The Community Git Book.12년 8월 23일 목요일
  • 108. Scott Chacon. (2008). The Community Git Book.12년 8월 23일 목요일
  • 109. TYPE 별 BODY 해석방법 • OBJ_COMMIT, OBJ_TREE, OBJ_BLOB, OBJ_TAG • Git Object의 body (deflate로 압축된 상태)12년 8월 23일 목요일
  • 110. TYPE 별 BODY 해석방법 • OBJ_REF_DELTA • body의 첫 20바이트는 base object의 sha1sum • 나머지는 base object에 대한 delta (deflate로 압축되어있 음)12년 8월 23일 목요일
  • 111. TYPE 별 BODY 해석방법 • OBJ_OFS_DELTA • header에서 body size를 해석한 것과 같은 방법으로 해 석해서 base object에 대한 offset을 얻는다. • 나머지 부분은 base object에 대한 delta (deflate로 압축 되어있음)12년 8월 23일 목요일
  • 112. DELTA COMPRESSION header src_size 1.
  • 113.   첫
  • 114.   비트가
  • 115.   0인
  • 116.   바이트까지
  • 117.   모두
  • 118.   읽는다. 2.
  • 119.   읽어들인
  • 120.   바이트의
  • 121.   첫
  • 122.   비트를
  • 123.   제거한
  • 124.   뒤
  • 125.   순서대로
  • 126.   연결한다. 3.
  • 127.   그
  • 128.   값을
  • 129.   src_size로
  • 130.   삼는다. dest_size 1.
  • 131.   위와
  • 132.   같은
  • 133.   방법으로
  • 134.   얻는다. header
  • 135.   
  • 136.   src_size
  • 137.   
  • 138.   
  • 139.   
  • 140.   1XXXXXXXX 
  • 141.   
  • 142.   
  • 143.   
  • 144.   
  • 145.   
  • 146.   
  • 147.   
  • 148.   
  • 149.   
  • 150.   
  • 151.   
  • 152.   
  • 153.   
  • 154.   
  • 155.   
  • 156.   
  • 157.   
  • 158.   
  • 159.   
  • 160.   ... body 
  • 161.   
  • 162.   
  • 163.   
  • 164.   
  • 165.   
  • 166.   
  • 167.   
  • 168.   
  • 169.   
  • 170.   
  • 171.   
  • 172.   
  • 173.   
  • 174.   
  • 175.   
  • 176.   
  • 177.   
  • 178.   
  • 179.   
  • 180.   0XXXXXXXX 
  • 181.   
  • 182.   
  • 183.   
  • 184.   
  • 185.   
  • 186.   
  • 187.   
  • 188.   dest_size
  • 189.   
  • 190.   
  • 191.   1XXXXXXXX 1.
  • 192.   한
  • 193.   바이트를
  • 194.   읽어서
  • 195.   모든
  • 196.   비트가
  • 197.   0이면
  • 198.   에러, 
  • 199.   
  • 200.   
  • 201.   
  • 202.   
  • 203.   
  • 204.   
  • 205.   
  • 206.   
  • 207.   
  • 208.   
  • 209.   
  • 210.   
  • 211.   
  • 212.   
  • 213.   
  • 214.   
  • 215.   
  • 216.   
  • 217.   
  • 218.   ... 2.
  • 219.   첫
  • 220.   비트가
  • 221.   1
  • 222.   이라면
  • 223.   다음의
  • 224.   규칙에
  • 225.   따른다. 
  • 226.   
  • 227.   
  • 228.   
  • 229.   
  • 230.   
  • 231.   
  • 232.   
  • 233.   
  • 234.   
  • 235.   
  • 236.   
  • 237.   
  • 238.   
  • 239.   
  • 240.   
  • 241.   
  • 242.   
  • 243.   
  • 244.   
  • 245.   0XXXXXXXX 1ABCDEFG body
  • 246.   
  • 247.   
  • 248.   
  • 249.   header
  • 250.   
  • 251.   
  • 252.   
  • 253.   
  • 254.   
  • 255.   0XXXXXXXX 1.
  • 256.   DEFG를
  • 257.   근거로
  • 258.   cp_off,
  • 259.   ABC를
  • 260.   근거로
  • 261.   cp_size를
  • 262.   구한다.
  • 263.   (좀
  • 264.   특이함) 
  • 265.   
  • 266.   
  • 267.   
  • 268.   1.1.
  • 269.   G,
  • 270.   F,
  • 271.   E,
  • 272.   D
  • 273.   순서로 
  • 274.   
  • 275.   
  • 276.   
  • 277.   
  • 278.   
  • 279.   
  • 280.   
  • 281.   to_dest
  • 282.   
  • 283.   
  • 284.   
  • 285.   
  • 286.   ... 
  • 287.   
  • 288.   
  • 289.   
  • 290.   1.2.
  • 291.   1이라면
  • 292.   pos
  • 293.   위치의
  • 294.   한
  • 295.   바이트를
  • 296.   읽고,
  • 297.   pos에
  • 298.   1을
  • 299.   더한다. 
  • 300.   
  • 301.   
  • 302.   
  • 303.   1.3.
  • 304.   1인
  • 305.   비트가
  • 306.   E라면
  • 307.   8비트,
  • 308.   F라면
  • 309.   16비트,
  • 310.   G라면
  • 311.   24비트를
  • 312.   왼쪽으로
  • 313.   shift 
  • 314.   
  • 315.   
  • 316.   
  • 317.   
  • 318.   
  • 319.   
  • 320.   
  • 321.   header
  • 322.   
  • 323.   
  • 324.   
  • 325.   
  • 326.   
  • 327.   1XXXXXXXX 한다. 
  • 328.   
  • 329.   
  • 330.   
  • 331.   1.4.
  • 332.   위의
  • 333.   방법으로
  • 334.   구한
  • 335.   값을
  • 336.   cp_off
  • 337.   에
  • 338.   더한다. 
  • 339.   
  • 340.   
  • 341.   
  • 342.   
  • 343.   
  • 344.   
  • 345.   
  • 346.   cp_off
  • 347.   
  • 348.   
  • 349.   
  • 350.   
  • 351.   
  • 352.   ... 
  • 353.   
  • 354.   
  • 355.   
  • 356.   1.5.
  • 357.   만약
  • 358.   cp_size
  • 359.   가
  • 360.   0이라면
  • 361.   65536으로
  • 362.   바뀐다.
  • 363.   (cp_size
  • 364.   =
  • 365.   cp_size
  • 366.   ||
  • 367.    65536) 
  • 368.   
  • 369.   
  • 370.   
  • 371.   
  • 372.   
  • 373.   
  • 374.   
  • 375.   cp_size
  • 376.   
  • 377.   
  • 378.   
  • 379.   
  • 380.   ... 2.
  • 381.   src에서
  • 382.   cp_off
  • 383.   부터
  • 384.   cp_size
  • 385.   크기만큼
  • 386.   읽어서
  • 387.   dest에
  • 388.   더한다. 
  • 389.   
  • 390.   
  • 391.   
  • 392.   2.1.
  • 393.   C,
  • 394.   B,
  • 395.   A
  • 396.   순서로 
  • 397.   
  • 398.   
  • 399.   
  • 400.   1.2.
  • 401.   1이라면
  • 402.   pos
  • 403.   위치의
  • 404.   한
  • 405.   바이트를
  • 406.   읽고,
  • 407.   pos에
  • 408.   1을
  • 409.   더한다. 
  • 410.   
  • 411.   
  • 412.   
  • 413.   2.3.
  • 414.   1인
  • 415.   비트가
  • 416.   E라면
  • 417.   8비트,
  • 418.   F라면
  • 419.   16비트,
  • 420.   G라면
  • 421.   24비트를
  • 422.   왼쪽으로
  • 423.   shift 한다. 3.
  • 424.   첫
  • 425.   비트가
  • 426.   0
  • 427.   이라면
  • 428.   다음의
  • 429.   규칙에
  • 430.   따른다. 0ABCDEFG ABCDEFG
  • 431.   바이트
  • 432.   만큼
  • 433.   읽어서
  • 434.   dest에
  • 435.   더한다. 4.
  • 436.   그
  • 437.   외에는
  • 438.   에러이다.12년 8월 23일 목요일
  • 439. DELTA COMPRESSION Git 소스코드를 읽는 것이 낫습니다. patch-delta.c12년 8월 23일 목요일
  • 440. LICENSE •이 문서는 GPLv2 라이선스로 배포됩니다. • This document is distributed under the GPLv2.12년 8월 23일 목요일