개요

Git을 이용하여 외부 모듈을 참조하려면 git submodule 명령을 이용해서 외부 모듈을 clone할 수 있다. git submodule 명령은 git clone과 달리 같은 작업 디렉토리(Working Directory)에 여러 모듈을 추가할 수 있는 장점이 있다.

샘플 코드 추가 (연습하기)

본 아티클에서 사용하는 샘플 코드는 필자가 개발한 Umc.Core의 의존성 주입(DI, Dependency Injection), 역전 제어(IoC, Inversion of Control), 관점 지향 프로그래밍(AOP, Aspect-Oriented Programming) 이다. submodule를 추가하고 제거하는 과정을 이해하기 쉽도록 Umc.Core 프로젝트를 사용한다.

$ git clone https://github.com/powerumc/Umc.Core.git
Cloning into 'Umc.Core'...
remote: Counting objects: 136, done.
remote: Compressing objects: 100% (83/83), done.
remote: Total 136 (delta 42), reused 136 (delta 42)
Receiving objects: 100% (136/136), 54.31 KiB | 0 bytes/s, done.
Resolving deltas: 100% (42/42), done.
Checking connectivity... done

git submodule 추가 

서브 모듈 추가

git submodule add 명령으로 외부 모듈을 현재 작업 디렉토리에 추가(clone)할 수 있다. submodule이 추가되었다면 git submodule status 명령으로 추가된 모듈 목록을 볼 수 있다.

$ git submodule add https://github.com/powerumc/array-extensions.git ./externals/array-extensions
Cloning into 'externals/array-extensions'...
remote: Counting objects: 124, done.
remote: Compressing objects: 100% (91/91), done.
remote: Total 124 (delta 42), reused 94 (delta 30)
Receiving objects: 100% (124/124), 45.27 KiB | 0 bytes/s, done.
Resolving deltas: 100% (42/42), done.
Checking connectivity... done

아래와 같이 외부 모듈을 하나 더 추가했다.

$ git submodule add https://github.com/powerumc/js-lambda.git ./externals/js-lambda
Cloning into 'externals/js-lambda'...
remote: Counting objects: 74, done.
remote: Compressing objects: 100% (67/67), done.
remote: Total 74 (delta 11), reused 21 (delta 3)
Unpacking objects: 100% (74/74), done.
Checking connectivity... done

그리고 외부 모듈을 모두 추가한 후 git commit을 했다.

$ git commit -m "added externals libs"
[master a83946b] added externals libs
 3 files changed, 8 insertions(+)
 create mode 100644 .gitmodules
 create mode 160000 externals/array-extensions
 create mode 160000 externals/js-lambda

Git submodule 제거

얼마 전 git submoduleadd할 수 만 있었고, deinit (remove)할 수 없었다. 좬장~ deinit 명령은 나중에 추가된 명령이므로 이 명령으로 오류가 나면 최신 scm-org.com 사이트를 방문하여 최신 버전으로 꼭 업데이트하자.

Submodule 제거

git submodule deinit 명령으로 submodule을 제거하고, 삭제된 모듈의 디렉토리를 rm 명령으로 삭제해 주면 된다. 그리고 git commit을 하면 외부 모듈을 삭제하여 커밋된다.

$ git submodule deinit ./externals/array-extensions/
Cleared directory 'externals/array-extensions'
$ git rm ./externals/array-extensions/
rm 'externals/array-extensions'
$ git commit -m "removed submodule array-extensions"
[master 6cdb9e0] removed submodule array-extensions
 1 file changed, 1 deletion(-)
 delete mode 160000 externals/array-extensions

모든 Submodule 제거

모든 submodule을 제거하고자 하면 deinit .으로 모두 제거하고, 커밋 하면 된다.

$ git submodule deinit .
Cleared directory 'externals/array-extensions'
Cleared directory 'externals/js-lambda'
$ git rm ./externals/*
rm 'externals/array-extensions'
rm 'externals/js-lambda'
$ git commit -m "removed all submodules"
[master a620887] removed all submodules
 2 files changed, 2 deletions(-)
 delete mode 160000 externals/array-extensions
 delete mode 160000 externals/js-lambda

다시 한번 얘기하지만, git submodule deinit 명령이 동작하지 않으면 최신 버전의 git으로 업데이트 하자.

Posted by 땡초 POWERUMC

댓글을 달아 주세요