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