안녕하세요, 타이젠 개발자 윤진입니다.


2015년 마지막 날을 맞이하여,

<아프니까 개발자다> 블로그 총결산을 진행하고자 합니다.

제 블로그를 찾아주시는 극소수의 개발자분들조차 총결산 따위에 관심없으시겠지만,

블로거로서 지난 한해를 돌아보고,

더 나은 내일을 구상하기 위해 2015년을 돌아보고자 합니다.


<아프니까 개발자다> 블로그 정보를 훑어보겠습니다.

그 동안 총 159개의 글을 썼습니다.

대부분의 글은 외부에 발행한 공개글이고,

열개 남짓한 글은 차후에 게시하기 위해 가다듬고 있는 중입니다.

댓글은 글마다 평균 0.6개 정도가 달리고 있습니다.

타이젠에 대해 전문적인 내용을 다룬 포스팅에는 댓글이 거의 없네요.

문의가 없다는 것은 그만큼 완벽하게 포스팅을 하고 있는 것이겠죠...?


마지막에 블로그 개설일이 뚜렷하게 찍혀있습니다.

2015년 3월 1일!

그렇습니다. 올해 3월 1일 삼일절에 블로그를 개설하였습니다.

일부러 삼일절을 되새기기 위해 굳이 그날 개설했습니다.

(농담 아닙니다. 히히;)




제 블로그는 주로 구글링으로 접근해서 들어오는 분이 많습니다.

불과 두어달 전까지만 해도 네이버를 통해서 들어오는 분들이 많았는데요,

어느 순간 구글이 치고 올라오기 시작하더니 압도적으로 수치가 올라가고 있습니다.

1위는 구글, 2~5위는 네이버, 6위는 다음입니다.


10위에 티스토리가 있네요.

아마 포스팅을 할때마다 티스토리 주제별 스토리에 게재가 되는데요,

그 때 타고 오는 분들이 있겠지요.


11위에는 카카오톡입니다.

카톡으로 제 블로그를 검색해서 오시는 분들도 있군요.

아직 1위인 구글의 1/100에 불과하지만 차츰 점유율을 높이길 기대해봅니다.


13위, 구글 재팬으로 들어오는 분도 있고,

14위, 구글 인도도 제법 있네요.

16위에는 구글 캐나다가 보이고,

20위에는 구글 호주도 있습니다.

영어공부를 열심히 해서 포스팅을 영어로도 해야하지 않나 고민하게 만드네요.


매달 방문한 사람수를 보며 어떤 글이 관심을 받았는지 정리해보고,

올 한해의 방문트랜드를 엿보고 내년을 예상해보겠습니다.



사실 개설한 첫달 3월은 하루 방문자 수가 극히 미미하였습니다.

3월 1일부터 31일까지 하루 평균 2명 정도가 다녀갔네요.

겨우 한 명이 방문한 14, 15, 16, 23일은 아마 제가 방문한게 아닌가 싶네요.

게다가 3, 12, 13, 18, 19, 20, 22, 24, 25, 26, 27일은 방문자가 없습니다.

블로거가 방문하지 않는 블로그!

대단합니다;


29일에 방문자가 폭증(?)한 것은 코딩컨벤션을 다룬 세번째 글때문입니다.

[Coding convention] 코딩의 기본, 시대의 흐름으로 살펴본 헝가리안 표기법

사실 첫달에 하루 방문자수가 두자리수가 되리라고 생각하지 않았는데요,

아직도 세상은 코딩컨벤션으로 다투는 개발자로 가득차 있어서,

제 블로그 기준으로 '많은' 개발자가 다녀간 것으로 보입니다;




4월은 매우 고무적인 달입니다.

하루 평균 방문자수가 무려 3명이 넘는 기염을 토하였습니다.

그 덕에 방문자 수가 한 명도 없는 날은 12일(일) 하루뿐입니다.

원래 전통적으로 토/일은 제 블로그가 굉장히 한산하죠...


이 달에 가장 인기있던 포스팅은,

오픈소스 타이젠에서 소스 형상관리를 위해 사용하는 'git'과 관련된 내용이었습니다.

[git] 깃의 속사정, 4대 원소를 파헤치기

많은 개발자들에게 필수툴로 자리잡은 git의 위력을 실감할 수 있습니다.

위의 포스팅 이후에도 git에 대해서는 다양한 이야기를 나누고 싶었지만,

최근에 git과 관련된 정보가 인터넷에 넘쳐나고 있어서 자제하고 있습니다.




5월은 거의 매일 두자리 수의 방문객을 유치한 혁신의 달이었습니다.

4월달의 평균 3명 방문했던 블로그가 평균 34명 방문하는 블로그가 됩니다.

무려 10배가 늘어났네요.

이 달의 격한 감동은 아직도 마음 깊숙한 곳에 자리잡고 있습니다.

하루 3명오던 블로그에 30명이라니!

게다가 5월 21일에는 무려 187명이 방문합니다.

세자리수를 처음으로 찍었습니다.


[Tizen] 타이젠 최초의 모바일 기기, "Z1"의 늦은 개봉기

5월 21일 포스팅은 타이젠 상품과 관련된 내용이었습니다.

타이젠을 다루는 블로그에 타이젠 상품과 관련된 포스팅이 관심받지 못하면 문제가 있는거겠죠;

서남아 시장에만 출시한 Z1의 개봉기를 간단하게 다루었었는데요,

개발자의 손에 하드웨어를 쥐어주면 참 많은 걸 할 수 있겠구나 생각이 들었습니다.



6월에는 하루평균 백여명이 방문하게 됩니다.

5월에 비해 3배 이상의 성장율을 달성하게 됩니다.

5월에는 31일 중 고작 이틀동안만 백여명 이상의 방문자를 유치했었는데요,

6월에는 거의 절반에 가까운 14일동안 백여명 이상의 방문자를 유치하였습니다.


그 중 가장 많은 사람이 찾아주었던 6월 13일에는 타이젠 보안의 핵심,

스맥을 다룬 포스팅이었습니다.

[SMACK] 스맥 레이블을 긋기 위한 manifest의 모든 것 - 파일편

대규모 플랫폼 중에서 타이젠이 가장 적극적으로 스맥을 사용하고 있습니다.

스맥을 알고 싶다면 타이젠 플랫폼을 분석하는 것도 의미가 있을 겁니다. 




7월에는 하루 평균 122명의 방문객이 다녀갑니다.

6월의 100명에 비해 22명이 더 늘어났습니다.

평일에는 거의 어김없이 세자리수를 유치하였고,

주말에는 역시 어김없이 두자리수에 머물고 있습니다.

제 블로그가 평일용으로 확정된 것이 7월달부터가 아닌가 싶습니다.

다들 업무시간에만 제 블로그를 찾는 것일까요?

그래서 업무 외의 시간에도 방문자를 유치할 수 있도록-

여러가지 다양한 내용을 다뤄야되겠단 생각을 했습니다.


7월에 가장 인기가 많았던 포스팅은,

[Tizen] 타이젠 스토어 182개국 오픈 중 4개국 유료판매가능

타이젠 앱스토어의 유료판매 정책에 대한 내용입니다.

182개국 중 4개국(인도, 방글라데시, 스리랑카, 네팔)에서 유료판매가 가능하게 되었죠.



8월에는 7월과 거의 유사한 수의 방문객이 다녀갔습니다.

7월에 122명이 다녀갔다면 8월에는 평균 123명이 다녀갔습니다.

하루 평균 2명 방문했던 블로그에 123명이 방문한다면 그야말로 대사건이긴 하지만,

100여명에서 정체된다면 아무래도 한계점에 다다른 것일 수도 있겠네요.


사실 8월에는 포스팅을 거의 하지 못한 기억이 납니다.

8월 29일에 서울 서초에서 타이젠 행사에서 세션발표를 맡게되어,

여러가지 준비를 하느라 정신없었죠.

[Tizen] 타이젠 DEVLAB @SEOUL 후기

위의 글이 가장 많은 방문자가 다녀간 날에 포스팅한 글입니다.

서울에서 열린 첫 타이젠 데브랩이니만큼 여러가지 많은 것을 느낄 수 있었습니다.




9월에는 하루 평균 120여명에 멈춰있었던 방문자수가 조금 증가하게 됩니다.

평균 145명으로 약 20여명의 방문자가 더 늘어났습니다.

타이젠에 관심을 가지고 있는 사람이 늘어났다기보다는,

일반적인 개발방법에 대해 다룬 글을 몇 개 올려서 외부 소프트웨어 개발자가 유입된 것으로 보입니다.


그 중 가장 많은 방문자를 유입한 날에 작성한 글은,

[소프트웨어 개발] Man-Month 허상과 히어로 개발자입니다.

위의 글은 타이젠 플랫폼을 만들고 계신 분들 중에 없어서는 안될 개발자분들을 떠올리며 작성했죠.

지금은 좀 더 늘어나긴 했지만,

저 글을 썼었던 당시에는 5명의 히어로 개발자 분들을 염두했죠.

물론 그 다섯 분들은 자신이 히어로 개발자들인 것을 인지하지 못하실 수도 있겠네요. :)

지극히 개인적인 생각입니다만,

저런 훌륭한 개발자들이 타이젠 플랫폼에 남아있는한,

타이젠은 점점 흥미로운 플랫폼으로 변모해나갈 것임을 확신할 수 있습니다.




시월에는 평균 145명 방문자가 192명으로 늘어납니다.

어느새 평균 200여명의 문턱에 다다르게 되었습니다.

이런 날이 이렇게 빨리 오게 될 줄은 상상하지 못했죠.


사실 시월에는 타이젠 외에 다양한 주제를 다루었습니다.

우선 삼성 오픈소스 컨퍼런스를 주제로 몇 건 포스팅하였죠.

삼성 대학생 프로그래밍 경진대회가 열린 달이기도 하고요.

코리아 리눅스 포럼에 대해서도 살짝 포스팅을 했습니다.

그래도 가장 많은 사람이 방문한 글은 SCSA에 대한 글이었습니다.

[SCSA] Samsung Convergence Software Academy를 말하다

삼성에서 만든 굉장히 독특한 제도이니 만큼,

외부의 관심도 많았습니다.

더불어 개인적으로도 아주 관심이 많습니다.

앞으로도 SCSA 전반을 계속 주시하며 정보를 '적극적으로' 갱신할 생각입니다.




11월은 앞으로 돌아오지 않을 호시절과 같은 달이었습니다.

이전달의 평균 192명 방문자는 이제 평균 378명으로 거의 두 배 가까이 늘어납니다.

방문자수가 폭발적으로 늘어나게된 이유는 기어S2가 출시되면서 타이젠에 관심이 많아진 것이겠지요.


가장 방문자가 많았던 글은,

[Tizen] 타이젠 세번째 웨어러블 기기, "Gear S2" 리뷰

위의 글이었습니다.

개발자들의 관심을 받게된 만큼,

타이젠은 생태계 구축에 더욱 힘을 쏟아야할 때입니다.



이 글을 쓰고 있는 12월 25일 기준으로,

하루 평균 218명의 방문자가 블로그를 찾고 있습니다.

기어 S2가 출시된 후 시간이 많이 흘렀기에 기어S2로 검색하여 들어오는 사람은 많이 줄었습니다.

그 대신 타이젠을 키워드로 들어오는 사람들이 200명이 넘습니다.


물론 이미 널리 알려진 여러 플랫폼들을 주제로 다룬 블로그는,

<아프니까 개발자다> 보다 10배 혹은 100배 많은 방문객을 유치하고 있겠죠?

내년에는 타이젠이 더 많은 사람들에게 사랑 받아서 덩달아 제 블로그에도 다시 호시절이 오면 좋겠습니다. :)

역시 타이젠 관련 블로그는 타이젠이 흥해야 같이 살아난다는 만고의 진리를 다시 한 번 확인하게 됩니다.


마지막으로 재미삼아서,

최근에 분석하기 시작한 구글 애널리틱스 분석자료를 보겠습니다.



제 블로그에 재방문자가 40%나 됩니다.

재방문자가 있다는 것은 뭔가 쓸만한 글이 있다는 반증이겠지요?

재방문자들을 실망시키지 않도록 2016년에는 흥미로운 주제를 더 많이 찾아내겠습니다.

"단골이여, 영원하라."



방문객은 평균 2~3분 정도 블로그에서 글을 읽었습니다.

2~3분이 결코 긴 시간은 아닌 만큼,

좀 더 퀄리티가 높은 글을 공유해야겠다는 생각이 듭니다. 



방문객은 1.5개 정도의 글을 읽고 돌아갔네요.

검색한 하나의 글만 보고 가는 분들도 있겠지만,

두개 이상을 보고 가는 분도 있네요.

흥미롭군요.



위의 그래프는 매일매일 시간에 따라 방문자를 나타낸 겁니다.

예외없이 평일 오후 3시에 그래프가 정점을 찍습니다.

제 블로그는 오후 3시에 들어오기 좋은 블로그인가 봅니다.

도대체 그 시간에 무슨 일이 벌어지고 있는 건가요?


이상으로 어쩌면 제게만 유의미할 지 모르는 2015 총결산을 마치겠습니다.

2016년 새해 복 많이 받으세요.

2016년 총결산때 다시 찾아뵙겠습니다.


감사합니다.

끝_




  1. 시스템가이 2015.12.31 23:44

    타이젠에 대해 이렇게 멋진 블로그를 운영하시는 분이 또한분 계시다니 감동이에요 ^^ 총 결산 글을 보니 다른 글들도 보게 되네요 잘 읽고 갑니다 ^^

    • 안녕하세요, 시스템가이님.
      새해 복 많이 받으세요~!
      시스템 가이님의 댓글을 보니 더 흥미로운 글을 많이 써야되겠다는 생각이 듭니다. 아직은 많이 부족하니 올 한해 바짝 허리띠를 졸라매야겠네요 :) 좋은 말씀 감사해요!

  2. 코코콩 2016.01.05 18:12 신고

    오후 3시는 점심먹고 업무에 몰두하다가 안풀려서 쉬는타임이죠 ㅋㅋㅋ

    • 제 블로그를 보면서 쉬는 분이 계실 수도 있겠군요.
      3시 고객을 위해 좀 더 재미나게 읽을거리를 준비해야겠네요. :)

혼자 개발하지 않는 이상,

팀원과 개발 중인 소스를 시시각각 공유해야할 필요가 있습니다.

타인과 데이터를 공유하는 수많은 방법이 있겠지만,

2015년 현재 가장 대중적으로 이용되는 git을 이용하여 소스를 공유하고자 합니다.


안녕하세요, Tizen 개발자 윤진입니다.


Tizen SDK 내에 git repository를 clone하거나 pull 받을 수 있는 기능은 없습니다.

Tizen SDK와 git은 서로 별개의 독립적인 모듈입니다.


따라서,

Tizen SDK에서 작업한 후,

git에서 수정사항을 push 하는 과정을 거쳐줘야 합니다.

vim에서 에디팅을 하고,

커맨드라인에서 git 명령어로 push 하는 것과 마찬가지의 절차입니다.


* 준비물

1. GIT Repository

2. Tizen SDK Project 

   (http://storycompiler.tistory.com/20 샘플앱 생성 참고)


위의 준비물은 미리 준비되어 있다고 가정하겠습니다.

Tizen SDK를 실행하여 git으로 공유하고자 하는 프로젝트를 엽니다.

그리고 File > Export 메뉴를 선택합니다.



Export 팝업창이 아래와 같이 뜹니다.

General > File System 메뉴를 선택합니다.



Next 버튼을 누르면,

SDK에 등록된 모든 프로젝트 리스트가 왼편에 나옵니다.

git repo.로 옮기고자하는 프로젝트를 선택합니다.

오른편 박스에는 해당 프로젝트에서 Export 하고자 하는 메타파일들이 나옵니다.

해당 파일들은 프로젝트를 위한 메타파일들이므로 모두 선택해야합니다.



To directory는 옮기고자 하는 git repo.의 루트 디렉토리 혹은 부모 디렉토리를 선택합니다.

- 루트 디렉토리 : git repo. 밑에 프로젝트명으로 디렉토리가 생성됩니다.

  git repo.에 다수의 프로젝트를 관리하고자 할때 효과적입니다.

  프로젝트 디렉토리 밑에 inc, src, res 와 같은 각종 디렉토리가 생성됩니다.

- 부모 디렉토리 : 프로젝트명과 git repo.명이 동일하게 설정된 경우,

  부모 디렉토리를 선택하면 git repo. 루트디렉토리에 바로 inc, src, res와 같은 디렉토리가 생성됩니다.

  한 git repo.에 하나의 프로젝트를 관리하고자 할때 사용하면 됩니다.


git repo.의 루트 디렉토리를 선택하여,

루트 디렉토리 밑에 프로젝트 디렉토리를 생성하였지만,

프로젝트 디렉토리만 없애고 루트디렉토리를 사용하길 원할 수도 있겠죠?

그럴 경우 프로젝트 디렉토리 안에 있는 모든 파일(숨김 파일 포함)을 루트 디렉토리로 복사하세요.


여기까지 진행하였다면,

git add / commit / push를 하세요.

팀원과 소스를 공유하기 위한 모든 준비가 끝났습니다.


팀원은 위에서 push한 커밋을 pull 받은 후,

Tizen SDK에서 File > Import 메뉴를 선택합니다.



Import 타입을 선택할 수 있는 팝업메뉴가 나타납니다.

General > Existing Projects into Workspace

위의 메뉴에 진입합니다.



Next 버튼을 눌러 다음으로 진행합니다.

Select root directory 라디오 버튼을 선택합니다.

그리고, Import 하고자 하는 git repo.의 루트 디렉토리를 기입하세요.



Finish 버튼을 누르면,

SDK 좌측에 좀 전에 Import한 프로젝트가 있는 것을 확인할 수 있습니다.


이제 SDK에서 코드를 마음껏 수정하고,

git 명령어를 통해 수정사항을 관리하면 됩니다.


팀원들과 합심하여 앱개발을 시작해보세요.


끝_

git에 대한 변변한 서적이 한 권 없던 시절,

한 선구자가 프로젝트에 전격적으로 git을 도입하였습니다.

이미 다른 형상관리툴에 익숙한 개발자들은 git이 결코 달갑지 않았습니다.

기존 툴을 장점을 수없이 열거하며 자신들에게 익숙한 과거로 회귀하자는 르네상스운동을 벌였습니다.

하지만 몇 년이 지난 지금...

이제는 git에 익숙해진 대다수 개발자들은,

'아직도 git을 사용하지 않는' 개발자들을 나무랄 정도로 git 신봉자가 되어버렸습니다.

이는 비단 우리 집단에서만 벌어진 일은 아닐 것입니다.

 

 

git은 가볍고 빠르죠.

'쉘환경이 윈도우보다 편한 개발자들'에게는 다른 툴보다 쉬울 지도 모릅니다-

 

다른 형상관리툴을 압도하기 위해,

git은 영악하게 설계되었습니다.

 

그리고 그 설계의 핵에는 4가지 원소가 있습니다.

commit, tree, blob, tag.

 

C언어에 char, int, long, float, double과 같은 데이터 타입이 있는 것처럼,

git은 내부적으로 commit, tree, blob, tag의 4가지 오브젝트 타입을 관리합니다.

 

이러한 오브젝트는 .git/objects에 개별적인 파일들로 존재합니다.

하나의 commit, 하나의 tree, 하나의 blob 그리고 하나의 tag는 각각 하나의 파일입니다.

두개의 commit은- 당연히 두개의 파일입니다.

 

오브젝트가 담긴 파일의 이름은 git이 오브젝트 컨텐츠의 내용을 참고하여 생성하는 40자리 문자열입니다.

git에 "hello.txt"라는 파일을 하나 추가하면,

"hello.txt"라는 이름의 오브젝트를 생성하는 것이 아닙니다.

"hello.txt"의 내용 전부를 해시테이블에 넣어,

40자리의 해시값을 뽑아내어 오브젝트 파일 이름으로 사용합니다.

 

그렇다면, "hello.txt"라는 이름은 어디에 저장되는 것일까요?

"hello.txt"를 위한 오브젝트인 blob에는 파일이름인 "hello.txt"라는 문자열이 저장되지 않습니다.

대신 디렉토리 구조를 나타내는 tree 오브젝트에서 "hello.txt"라는 문자열을 찾을 수 있습니다.

이는 리눅스 파일시스템에서 흔히 사용하는 inode - dentry의 관계와 동일합니다.

(이에 대한 설명은 본 주제와 무관하므로 생략합니다.)

리눅스를 개발한 리누즈가 git에도 동일한 개념을 차용했다는 점은 쉽게 유추할 수 있습니다.

 

이러한 오브젝트들은 하나의 파일로 .git/objects에 차곡차곡 쌓이게 되는데,

한 디렉토리에 너무 많은 파일이 있으면 파일 시스템의 성능이 저하될 수 있기 때문에,

오브젝트의 파일이름 중 앞 2글자는 디렉토리 이름으로 사용하고,

나머지 38글자를 파일이름으로 사용하게 됩니다.

 

각각의 오브젝트 타입마다 담고 있는 내용은 아래와 같습니다.

 

 blob(binary large object)

- 타입 : "blob" 타입
- 사이즈 : 컨텐츠의 용량을 bytes로 표시
- 컨텐츠 : blob의 컨텐츠에는 텍스트, 이미지, 음악 혹은 단순 이진 파일처럼 다양한 형식의 파일이 저장될 수 있다.
  파일이름이나 파일형식은 blob에 저장되지 않는다.
  파일의 메타정보를 제외한 파일의 내용 전체를 품는다.

 

 tree

- 타입 : "tree" 타입
- 사이즈 : 트리 오브젝트의 용량을 bytes로 표시
- tree 객체 : 하위 디렉토리의 트리 객체를 재귀적으로 참조할 수 있다.
- blob 객체 : 한 디렉토리에 있는 모든 blob을 담고 있다.
   객체에 대한 접근권한, 파일이름은 여기서 관리한다.

 

 commit

- 작성자
- 커밋 실행자
- 커밋 날짜
- 로그 메시지
- tree 객체 : 해당 커밋에서의 dir/file의 상태를 알 수 있다.

 

 tag

- 객체종류
- 태그이름
- tagger
- 태그메시지
- PGP 서명정보


git에는 고맙게도 오브젝트의 상태정보를 얻을 수 있는 명령어가 노출되어 있습니다.

git cat-file을 오브젝트에 사용하여 오브젝트가 품고 있는 정보를 자세히 알아보려 합니다.

usage: git cat-file (-t|-s|-e|-p|<type>|--textconv) <object>
   or: git cat-file (--batch|--batch-check) < <list_of_objects>

<type> can be one of: blob, tree, commit, tag
    -t                    show object type
    -s                    show object size
    -e                    exit with zero when there's no error
    -p                    pretty-print object's content
    --textconv            for blob objects, run textconv on object's content
    --batch[=<format>]    show info and content of objects fed from the standard input
    --batch-check[=<format>]
                          show info about objects fed from the standard input


- 우선, 새로운 git repository를 하나 만듭니다.

$ git init
$ ls -la .git/objects/
.git/objects/:
합계 16
drwxrwxr-x 4 jinux jinux 4096 4월 6 00:57 .
drwxrwxr-x 7 jinux jinux 4096 4월 6 00:57 ..
drwxrwxr-x 2 jinux jinux 4096 4월 6 00:57 info
drwxrwxr-x 2 jinux jinux 4096 4월 6 00:57 pack

위의 .git/object 디렉토리에는 info와 pack 디렉토리가 있습니다.

이 두 디렉토리가 오브젝트는 아닙니다.

 

- "hello.txt" 를 추가해보자.

$ echo "Hello" > Hello.txt
$ git add Hello.txt
$ git commit -m "Add Hello.txt"
[master (root-commit) 44cac0a] Add Hello.txt
1 file changed, 1 insertion(+)
create mode 100644 Hello.txt
$ ls -la .git/objects/
합계 28
drwxrwxr-x 7 jinux jinux 4096 4월 6 02:03 .
drwxrwxr-x 8 jinux jinux 4096 4월 6 02:03 ..
drwxrwxr-x 2 jinux jinux 4096 4월 6 02:03 2e
drwxrwxr-x 2 jinux jinux 4096 4월 6 02:03 44
drwxrwxr-x 2 jinux jinux 4096 4월 6 02:03 e9
drwxrwxr-x 2 jinux jinux 4096 4월 6 00:57 info
drwxrwxr-x 2 jinux jinux 4096 4월 6 00:57 pack

위에 총 3개의 오브젝트(2e, 44, e9)가 생겼습니다.

파일 하나(e9)를 추가했고,

파일이 담긴 tree(2e)가 추가되었고,

커밋(44)이 하나 추가되었습니다.

우선, 커밋의 내용을 살펴보죠.

 

$ git cat-file -p 44cac0afe16f0819bba6cc2332b9418ba3c1ce8b
tree 2ea873e13e84497d7459150a0b2b662403e3bc2b
author Storycompiler <storycompiler@hanmail.net> 1428253401 +0900
committer Storycompiler <storycompiler@hanmail.net> 1428253401 +0900

Add Hello.txt

커밋이 가리키는 tree ID가 명시되어 있습니다.

author와 committer가 시간과 함께 기록되어 있습니다.

그리고 마지막 줄은 메시지가 있습니다.

위의 커밋이 가리키는 트리도 살펴보죠.

 

$ git cat-file -p 2ea873e13e84497d7459150a0b2b662403e3bc2b
100644 blob e965047ad7c57865823c7d992b1d046ea66edf78 Hello.txt

트리는 저장된 오브젝트가 blob인지 tree이지 가리는 인자가 권한정보를 뒤이어 나옵니다.

그리고 오브젝트의 ID와 파일 혹은 디렉토리이름이 나옵니다.

파일명 혹은 디렉토리명을 트리에서 관리한다는 것을 다시 확인할 수 있습니다.

 

 

blob가 가리키는 파일을 아래와 같습니다.

 

$ git cat-file -p e965047ad7c57865823c7d992b1d046ea66edf78
Hello

blob에는 파일의 내용만 저장되어 있습니다.

그 외의 메타정보는 찾을 수가 없습니다.

 

- "world.txt"를 추가해보죠.

 

$ echo "World" > "world.txt"
$ git add world.txt
$ git commit -m "Add world.txt"
[master 839b975] Add world.txt
1 file changed, 1 insertion(+)
create mode 100644 world.txt
$ ls -la .git/objects/
합계 40
drwxrwxr-x 10 jinux jinux 4096 4월 6 02:34 .
drwxrwxr-x 8 jinux jinux 4096 4월 6 02:34 ..
drwxrwxr-x 2 jinux jinux 4096 4월 6 02:34 08
drwxrwxr-x 2 jinux jinux 4096 4월 6 02:33 21
drwxrwxr-x 2 jinux jinux 4096 4월 6 02:03 2e
drwxrwxr-x 2 jinux jinux 4096 4월 6 02:03 44
drwxrwxr-x 2 jinux jinux 4096 4월 6 02:34 83
drwxrwxr-x 2 jinux jinux 4096 4월 6 02:03 e9
drwxrwxr-x 2 jinux jinux 4096 4월 6 00:57 info
drwxrwxr-x 2 jinux jinux 4096 4월 6 00:57 pack

 

오브젝트가 6개가 되었습니다.

기존의 오브젝트(2e, 44, e9)는 그대로 있고,

커밋(83), 트리(08), 새로운 파일(21) 3개의 오브젝트 파일이 추가되었습니다.

커밋이나 파일은 모두 새로운 내용이므로 새로운 파일이 당연합니다.

그렇다면 트리는 왜 추가되었을까요?

왜냐하면 트리는 blob에 대한 내용물을 담고 있는데,

파일이 하나 늘면서 해당 blob을 트리에 추가하였기 때문입니다.

$ git cat-file -p 08be0f512375756b66561c0dcfb8429cd2ab5193
100644 blob e965047ad7c57865823c7d992b1d046ea66edf78	Hello.txt
100644 blob 216e97ce08229b8776d3feb731c6d23a2f669ac8	world.txt

- "subdir" 디렉토리를 추가한 후, "hello.txt"와 "world.txt"를 복사해보죠.

$ mkdir subdir
$ ls
Hello.txt  subdir  world.txt
$ cp Hello.txt subdir/
$ cp world.txt subdir/
$ git add subdir
$ git commit -m "Add subdir"
[master 2f5bfb4] Add subdir
 2 files changed, 2 insertions(+)
 create mode 100644 subdir/Hello.txt
 create mode 100644 subdir/world.txt
$ ls -al .git/objects/
합계 48
drwxrwxr-x 12 jinux jinux 4096  4월  6 02:44 .
drwxrwxr-x  8 jinux jinux 4096  4월  6 02:44 ..
drwxrwxr-x  2 jinux jinux 4096  4월  6 02:34 08
drwxrwxr-x  2 jinux jinux 4096  4월  6 02:33 21
drwxrwxr-x  2 jinux jinux 4096  4월  6 02:03 2e
drwxrwxr-x  2 jinux jinux 4096  4월  6 02:44 2f
drwxrwxr-x  2 jinux jinux 4096  4월  6 02:03 44
drwxrwxr-x  2 jinux jinux 4096  4월  6 02:44 6f
drwxrwxr-x  2 jinux jinux 4096  4월  6 02:34 83
drwxrwxr-x  2 jinux jinux 4096  4월  6 02:03 e9
drwxrwxr-x  2 jinux jinux 4096  4월  6 00:57 info
drwxrwxr-x  2 jinux jinux 4096  4월  6 00:57 pack


subdir을 생성하고,

파일 2개를 복사해서 넣었습니다.

하지만 현재 총 오브젝트 파일은 기존에서 2개만 추가된 8개입니다.

기존의 오브젝트 파일(2e, 44, e9, 83, 08, 21)에서 2f, 6f 오브젝트만 추가되었습니다.

이 파일 두개는 무엇일까요?


$ git cat-file -p 2f5bfb452a671dc72b9f1ac17865212c98311262 
tree 6f3f9a776e764914ce54a476e39155d1fe4ddf65
parent 839b97545a2ec5a34a8c6f0152be72b418a82df3
author Storycompiler  1428255851 +0900
committer Storycompiler  1428255851 +0900

우선 2f 파일은 신규로 생성한 커밋 오브젝트 파일입니다.


$ git cat-file -p 6f3f9a776e764914ce54a476e39155d1fe4ddf65
100644 blob e965047ad7c57865823c7d992b1d046ea66edf78	Hello.txt
040000 tree 08be0f512375756b66561c0dcfb8429cd2ab5193	subdir
100644 blob 216e97ce08229b8776d3feb731c6d23a2f669ac8	world.txt

다른 하나는 subdir이 생겨서 내용이 변경된 root tree의 오브젝트입니다.

그렇다면, subdir의 객체(08be0f512375756b66561c0dcfb8429cd2ab5193)는 어디에 있을까요?

subdir은 "Hello.txt"와 "world.txt"를 가지는 디렉토리로,

좀 전의 root 디렉토리를 지칭한 트리객체와 그 내용이 동일합니다.

따라서 08be로 시작하는 기존의 트리 오브젝트를 그대로 사용하게 됩니다.

 

git의 속사정을 몰라도 개발하는데 아무 지장이 없습니다.

사실 세상 대부분을 몰라도 개발하는데 아무 지장이 없습니다.

하지만, 그 많은 개발자 중에 어쩌면 한두 명이라도 궁금해할지도 모른다는 생각에 포스팅을 남깁니다.

혹시 당신이 바로 그 개발자라면...

당신의 존재가 이 포스팅을 월요일 오전 3시 20분에 작성하고 있는 날 위안시켜주네요.

출근 2시간 40분 전.

 

 

_끝

  1. 개발자 2015.06.24 02:43

    훌륭한 설명 감사드립니다. 진정한 개발자 이십니다.

  2. 안녕하세요 2015.08.10 13:07

    정말 잘 읽었습니다! 명쾌한 설명이었어요! 실습 예제도 자세하게 설명해주시고 너무나도 큰 도움이 되었습니다. 감사합니다!

  3. 슈웅~ 2016.05.14 21:10

    포스팅 말미에 어쩌면 한두 명이라도 궁금해할지도 모른다는 생각 이란 부분이 지식탐구,나눔 를 향한 올바른자세? 라고 생각하는바 입니다. 큰 깨달음을 얻고 갑니다 포스팅 감사해요!

  4. 지하철 코더 2016.11.25 15:26

    잘 읽고 갑니다. 큰 도움이 되었습니다 :D
    (댓글 버튼을 못찾아서 한참 헤멨어요..ㅋㅋ)

  5. 건대CE 2017.02.02 14:05

    정말 감사합니다.. 너무 궁금해서 3시간 찾아봤는데.. 진짜 가슴이 뻥뚫렸습니다..

+ Recent posts