Close

하위 모듈: 핵심 개념, 워크플로 및 팁

Nicola Paolucci 얼굴 사진
Nicola Paolucci

개발자 애드보케이트


Git 개발의 일부로 하위 모듈을 포함하면 코드베이스에 다른 프로젝트를 포함시켜 프로젝트 기록은 별도로 유지하면서 사용자의 프로젝트와 동기화할 수 있습니다. 공급업체 라이브러리와 종속성 문제를 해결하는 편리한 방법입니다. 모든 Git과 마찬가지로 이 접근 방식은 독단적이며 능숙하게 사용하기 전에 약간의 연구가 필요합니다. 하위 모듈에 대한 적절하고 상세한 정보가 이미 있으므로 더 이상 살펴보지 않겠습니다. 여기서는 이 기능을 최대한 활용하는 데 도움이 될 몇 가지 흥미로운 내용을 공유하겠습니다.

데이터베이스
관련 자료

전체 Git 리포지토리를 이동하는 방법

Bitbucket 로고
솔루션 보기

Bitbucket Cloud에서 Git에 대해 알아보기

핵심 개념


먼저 하위 모듈에서 작업을 쉽게 만들어주는 하위 모듈의 핵심 개념에 대해 간략하게 설명해 드리겠습니다.

하위 모듈은 브랜치, ref 또는 다른 기호 참조가 아니라 상위 프로젝트에 지정된 정확한 커밋으로 추적됩니다.

하위 모듈에서 지정한 리포지토리가 업데이트될 때 절대 자동으로 업데이트되지 않으며 상위 프로젝트 자체가 업데이트될 때만 업데이트됩니다. 앞서 언급한 Pro Git 챕터에서 아주 분명하게 설명한 것과 같이,

무언가를 변경하고 해당 [하위 모듈] 하위 디렉터리에서 커밋하면 상위 프로젝트가 HEAD가 변경되었음을 확인하고 현재 작업 중인 커밋을 정확하게 기록합니다. 그러면 다른 사용자가 프로젝트를 복제할 때 환경을 정확히 재현할 수 있습니다.

[...] git 하위 모듈 [...]은 아주 정적입니다. 특정 커밋을 브랜치, 참조, 단일 커밋이 아니라 git 하위 모듈로 추적하고 있습니다. 하위 모듈에 커밋을 추가하면 상위 프로젝트는 이를 알지 못합니다. 모듈의 포크 수가 많아도 git 하위 모듈에는 상관없습니다. 하나의 원격 리포지토리가 있고 하나의 커밋을 가리키고 있습니다. 상위 프로젝트를 업데이트하기 전까지는 아무것도 변경되지 않습니다.

가능한 워크플로


핵심 개념을 기억하고 되짚어보면 submodule이 어떤 워크플로는 잘 지원하지만 다른 워크플로는 최적으로 지원하지 않는 것을 이해할 수 있습니다. 하위 모듈이 괜찮은 선택이 되는 시나리오는 적어도 세 개 있습니다.

  • 구성 요소 또는 하위 프로젝트가 너무 빠르게 변경되거나 예정된 변경으로 인해 API가 중단되는 경우 안전을 위해 코드를 특정 커밋에 잠글 수 있습니다.

  • 자주 업데이트되지 않는 구성 요소가 있고 공급업체 종속성으로 추적하려는 경우입니다. 예를 들어 저는 vim 플러그인에 대해 이 작업을 수행합니다.

  • 프로젝트의 일부를 제3자에게 위임하고 특정 시간이나 릴리스에 작업을 통합하려는 경우입니다. 다시 한 번 강조하자면 업데이트가 너무 빈번하지 않을 때 효과적입니다.

잘 설명된 시나리오에 대해 finch에게 감사를 드립니다.

유용한 팁


하위 모듈 인프라는 강력하며 코드베이스를 유용하게 분리하고 통합할 수 있습니다. 하지만 간소화된 절차가 없거나 강력한 명령줄 사용자 인터페이스를 지원하지 않는 간단한 작업이 있습니다.

프로젝트에서 git 하위 모듈을 사용하는 경우 이미 이러한 일을 이미 겪어 봤거나 접하게 될 것입니다. 그런 일이 생기면 계속해서 솔루션을 찾아봐야 합니다. 조사에 걸리는 시간을 절약해 드리겠습니다. Instapaper, Evernote 또는 옛 방식으로 책갈피에 추가(:D:D)하면 준비가 된 것입니다.

제가 준비한 내용은 다음과 같습니다.

자체 포크로 git 하위 모듈을 바꾸는 방법


이것은 매우 일반적인 워크플로입니다. 다른 사용자의 프로젝트를 하위 모듈로 사용하기 시작했는데 잠시 후 이를 사용자 지정하고 직접 수정할 필요가 있음을 알게 됩니다. 따라서 프로젝트를 포크하고 하위 모듈을 자체 포크로 교체해야 합니다. 이 작업은 어떻게 이루어질까요?

하위 모듈은 .gitmodules에 저장됩니다.

$ cat .gitmodules [submodule "ext/google-maps"] path = ext/google-maps url = git://git.naquadah.org/google-maps.git

텍스트 편집기로 URL을 편집하고 다음을 실행하면 됩니다.

$ git submodule sync

그러면 .git/config가 업데이트되며 여기에는 이 하위 모듈 목록의 복사본이 들어 있습니다(.git/config의 관련 [submodule] 섹션을 수동으로 편집하기만 하면 됨).

Stack Overflow 참조

하위 모듈을 제거하는 방법


꽤 흔한 요구 사항이지만 절차가 약간 복잡합니다. 하위 모듈을 제거하려면 다음을 수행해야 합니다.

1. .gitmodules 파일에서 관련 줄을 삭제합니다.

2. .git/config에서 관련 섹션을 삭제합니다.

3. git rm --cached path_to_submodule(후행 슬래시 없음)을 실행합니다.

4. 이제 추적되지 않는 하위 모듈 파일을 커밋하고 삭제합니다.

Stack Overflow 참조

하위 모듈을 프로젝트에 다시 통합하는 방법


또는 다른 말로 git 하위 모듈을 어떻게 하위 모듈 취소합니까? 하위 모듈 코드를 메인 리포지토리에 넣기만 하려면 하위 모듈을 제거하고 파일을 메인 리포지토리에 다시 추가하면 됩니다.

1. 색인에서 하위 모듈에 대한 참조를 삭제하되 파일은 유지합니다.

git rm --cached submodule_path (no trailing slash)

2. .gitmodules 파일을 삭제하거나 하위 모듈이 두 개 이상이면 목록에서 하위 모듈을 제거하여 이 파일을 편집합니다.

git rm .gitmodules

3. .git 메타데이터 폴더를 제거합니다(백업해 두세요).

rm -rf submodule_path/.git

4. 메인 리포지토리 색인에 submodule을 추가합니다.

git add submodule_path git commit -m "remove submodule"

참고: 위에서 설명한 절차는 하위 모듈의 기록을 삭제하므로 하위 모듈과 동일한 기록을 보존하려면 고급 "병합" 작업을 수행해야 합니다. 자세한 내용은 완전한 Stack Overflow 참조를 확인하세요.

하위 모듈의 변경 사항을 무시하는 방법


가끔 submodules가 저절로 dirty될 수도 있습니다. 예를 들어 git submodules를 사용하여 vim 플러그인을 추적하면 helptags와 같은 로컬 파일을 생성하거나 수정할 수 있습니다. 하지만 git status의 경우 사용자가 변경 사항에 전혀 관심이 없고 커밋할 의사가 없더라도 이러한 변경 사항으로 인해 일이 번거로워집니다.

이를 해결하는 방법은 아주 간단합니다. .gitmodules 파일을 리포지토리의 루트에서 열고 무시하려는 각 하위 모듈에 ignore = dirty를 추가합니다. 예를 들면 다음과 같습니다.

[submodule ".vim/bundle/msanders-snipmate"] path = .vim/bundle/msanders-snipmate url = git://github.com/msanders/snipmate.vim.git ignore = dirty

훌륭한 설명을 해준 Nils에게 감사의 말씀을 드립니다.

위험 구역! 원격 리포지토리와 상호 작용할 때의 위험


kernel.org의 Git 하위 모듈 자습서에서 알 수 있듯이 원격 리포지토리와 상호 작용할 때 몇 가지 중요한 사항에 유의해야 합니다.

첫 번째는 항상 하위 모듈 변경 사항을 게시한 다음 이를 참조하는 상위 프로젝트에 변경 사항을 게시하는 것입니다. 다른 사용자의 리포지토리 복제를 방해할 수 있기 때문에 매우 중요합니다.

두 번째는 변경 사항이 덮어쓰여지는 것처럼 git submodule update를 실행하기 전에 항상 모든 변경 사항을 커밋해야 한다는 것입니다.

결론


이러한 참고 사항을 기억하면 하위 모듈을 사용할 때 자주 발생하는 여러 워크플로를 처리할 수 있습니다. 다음 게시물에서는 git submodule의 대안에 대해 작성할 것입니다.

DVCS에 대해 더 자세히 알아보려면 제 계정인 @durdn@Bitbucket 팀을 팔로우하세요.

Nicola Paolucci

Nicola is an all-round hacker who loves exploring and teaching bleeding edge technologies. He writes and talks about Git, development workflows, code collaboration and more recently about Docker. Prior to his current role as Developer Instigator at Atlassian he led software teams, built crowd sourcing applications for geo-spacial data, worked on huge e-commerce deployments. Little known facts about Nicola: he gesticulates a lot while speaking (being Italian), lives in Amsterdam and rides a Ducati.


이 문서 공유
다음 토픽

여러분께 도움을 드릴 자료를 추천합니다.

이러한 리소스에 책갈피를 지정하여 DevOps 팀의 유형에 대해 알아보거나 Atlassian에서 DevOps에 대한 지속적인 업데이트를 확인하세요.

도구로 가득한 벽을 사용하여 협업하는 사람들

Bitbucket 블로그

DevOps 일러스트레이션

DevOps 학습 경로

Atlassian 전문가와 함께 하는 Demo Den 기능 데모

Bitbucket Cloud가 Atlassian Open DevOps와 작동하는 방법

DevOps 뉴스레터 신청

Thank you for signing up