Git 기초 정리

Git Submodule

부모 프로젝트가 있고, 그 아래에서 자식 프로젝트를 관리하기 위해 필요한 것이다.

Example

myproject

자식 프로젝트를 먼저 만들자

$ mkdir myproject
$ cd myproject
$ git init
Initialized empty Git repository in /Users/username/project/myproject/.git/

myproject에 commit한다.

$ echo "Important code and data" > some_data.txt
$ git add some_data.txt
$ git commit -m "Initial commit on myproject"
[master (root-commit) 196bbbb] Initial commit on myproject
 1 file changed, 1 insertion(+)
 create mode 100644 some_data.txt

그리고 다시 프로젝트 바깥으로 나오자

superproject

부모 프로젝트를 만든다.

$ mkdir super
$ cd super
$ git init
Initialized empty Git repository in /Users/username/project/superproject/.git/

.git/objects에는 이런 구조로 이루어져있다.

objects
├── info
└── pack
$ echo "This project will use ``myproject``" > README.txt
$ git add README.txt

새로운 file을 add하면, .git/objects에 마찬가지로 새롭게 file이 생긴다.

objects
├── 9c
│   └── 0042144fc489d7b528ef186af49e78c2867f91 [43B]
├── info
└── pack

superproject에 새로운 프로젝트를 commit한다.

$ git commit -m "Initial commit on super"
[master (root-commit) 2326240] Initial commit on super
 1 file changed, 1 insertion(+)
 create mode 100644 README.txt

commit까지 할 경우, .git/objects엔 3개의 객체가 생긴다.

  • root디렉토리의 디렉토리 리스트를 제공하는 tree객체
  • commit자체에 대한 정보를 제공하는 commit객체
  • file 정보
objects
├── 23
│   └── 262403a0b913d02219ead935dd1a85d3724a0d [139B]
├── 9c
│   └── 0042144fc489d7b528ef186af49e78c2867f91 [43B]
├── f1
│   └── 3a8c8331c76ac965c43b09d11ee2d72bb053c1 [55B]
├── info
└── pack

myproject를 superproject 하위모듈(submodule)로 추가하기

superproject 경로에서 myproject를 하위모듈로 추가해보자.(subproject라는 파일명으로 추가)

$ git submodule add ../myproject subproject
Cloning into 'subproject'...
done.
$ git status
On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

	new file:   .gitmodules
	new file:   subproject