Git 서브모듈 상태 확인 방법: 저장소 관리 팁

GitBeginner
지금 연습하기

소개

Git 서브모듈은 자체 프로젝트 내에 외부 저장소를 포함할 수 있게 해주는 강력한 기능입니다. 이 기능은 프로젝트가 별도로 관리되는 외부 라이브러리 또는 구성 요소에 의존할 때 특히 유용합니다. 서브모듈을 사용하면 이러한 종속성을 최신 상태로 유지하고 잘 관리할 수 있습니다.

이 튜토리얼에서는 저장소에서 Git 서브모듈의 상태를 확인하고, 서브모듈에 어떤 변경 사항이 있었는지 이해하며, 소스 저장소와 제대로 동기화되었는지 확인하는 방법을 배우게 됩니다.

서브모듈을 사용하여 저장소 생성하기

학습을 위한 실용적인 환경을 갖추기 위해 서브모듈이 있는 샘플 저장소를 생성하는 것으로 시작해 보겠습니다.

메인 저장소 설정

먼저, 서브모듈을 추가할 새로운 메인 저장소를 생성합니다. 터미널을 열고 다음 명령을 실행합니다.

cd ~/project
mkdir main-repo
cd main-repo
git init

다음과 유사한 출력을 볼 수 있습니다.

Initialized empty Git repository in /home/labex/project/main-repo/.git/

이제 메인 저장소에 간단한 파일을 생성해 보겠습니다.

echo "## Main Repository" > README.md
git add README.md
git commit -m "Initial commit"

출력은 첫 번째 커밋을 생성했음을 나타냅니다.

[master (root-commit) xxxxxxx] Initial commit
 1 file changed, 1 insertion(+)
 create mode 100644 README.md

서브모듈 추가

이제 메인 저장소에 서브모듈을 추가해 보겠습니다. 이 튜토리얼에서는 작은 공개 저장소를 서브모듈로 사용합니다.

git submodule add https://github.com/libgit2/libgit2-backends.git libs/libgit2-backends

이 명령은 저장소를 복제하고 libs/libgit2-backends 디렉토리에 서브모듈로 추가합니다. 다음과 유사한 출력을 볼 수 있습니다.

Cloning into '/home/labex/project/main-repo/libs/libgit2-backends'...
remote: Enumerating objects: xxx, done.
remote: Counting objects: 100% (xxx/xxx), done.
remote: Compressing objects: 100% (xxx/xxx), done.
remote: Total xxx (delta xx), reused xxx (delta xx), pack-reused xxx
Receiving objects: 100% (xxx/xxx), xxx KiB | xxx KiB/s, done.
Resolving deltas: 100% (xxx/xxx), done.

변경 사항 이해

서브모듈을 추가하면 Git 은 저장소에 서브모듈의 URL 및 경로를 추적하는 .gitmodules 파일을 생성합니다. 이 파일을 살펴보겠습니다.

cat .gitmodules

다음과 유사한 내용을 볼 수 있습니다.

[submodule "libs/libgit2-backends"]
    path = libs/libgit2-backends
    url = https://github.com/libgit2/libgit2-backends.git

저장소의 상태도 확인해 보겠습니다.

git status

새로운 .gitmodules 파일과 서브모듈 디렉토리가 모두 추가되었음을 나타내는 출력을 볼 수 있습니다.

On branch master
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   .gitmodules
        new file:   libs/libgit2-backends

설정을 완료하기 위해 이러한 변경 사항을 커밋해 보겠습니다.

git commit -m "Add libgit2-backends submodule"

이제 서브모듈이 성공적으로 설정된 저장소를 갖게 됩니다.

서브모듈 상태 확인

이제 서브모듈이 있는 저장소가 있으므로 서브모듈의 상태를 확인하고 출력의 의미를 이해하는 방법을 알아보겠습니다.

기본 서브모듈 상태 확인

Git 은 서브모듈의 상태를 확인하기 위한 특정 명령을 제공합니다. 다음 명령을 실행합니다.

cd ~/project/main-repo
git submodule status

다음과 유사한 출력을 볼 수 있습니다.

+abcdef1234567890abcdef1234567890abcdef12 libs/libgit2-backends (v1.0.0-123-gabcdef12)

이 출력의 의미를 이해해 보겠습니다.

  1. 첫 번째 문자는 다음 중 하나일 수 있습니다.

    • +: 체크아웃된 서브모듈 커밋이 메인 저장소에 등록된 것과 다름을 나타냅니다.
    • (공백): 서브모듈이 등록된 것과 동기화되었음을 나타냅니다.
    • -: 서브모듈이 초기화되지 않았음을 나타냅니다.
    • U: 서브모듈에 병합 충돌이 있음을 나타냅니다.
  2. 영숫자 문자열은 서브모듈에서 체크아웃된 현재 커밋의 커밋 해시입니다.

  3. 경로는 서브모듈이 저장소 내에 있는 위치를 보여줍니다.

  4. 괄호 안의 텍스트는 태그 또는 브랜치 이름과 같이 체크아웃된 커밋에 대한 추가 정보를 보여줍니다.

상세 서브모듈 정보

서브모듈에 대한 자세한 정보를 보려면 다음 명령을 사용할 수 있습니다.

git submodule

이것은 상태 명령과 유사한 정보를 다른 형식으로 표시합니다.

Git Status 를 사용하여 서브모듈 변경 사항 확인

표준 git status 명령을 사용하여 서브모듈의 변경 사항을 확인할 수도 있습니다.

git status

서브모듈에 변경 사항이 없으면 출력에 언급되지 않습니다. 그러나 서브모듈의 체크아웃된 커밋 또는 서브모듈 내의 파일에 변경 사항이 있는 경우 git status는 이 정보를 표시합니다.

서브모듈 내용 검사

서브모듈의 내용을 검사해 보겠습니다.

cd ~/project/main-repo
ls -la libs/libgit2-backends/

libgit2-backends 저장소의 파일을 볼 수 있습니다. 서브모듈은 기본적으로 메인 저장소 내의 완전한 Git 저장소입니다. .git 디렉토리가 있는지 확인하여 이를 확인할 수 있습니다.

ls -la libs/libgit2-backends/.git

.git 디렉토리를 직접 볼 수 없을 수 있지만, 대신 메인 저장소의 .git/modules 디렉토리에 저장된 실제 Git 저장소 데이터를 가리키는 파일을 볼 수 있습니다. 이것이 Git 이 서브모듈을 관리하는 방식입니다.

서브모듈 참조 이해

메인 저장소는 서브모듈 저장소의 특정 커밋에 대한 참조를 저장합니다. 이 참조는 저장소를 복제하거나 서브모듈을 업데이트할 때 Git 이 어떤 버전의 서브모듈을 체크아웃해야 하는지 알기 위해 사용하는 것입니다.

메인 저장소가 참조하는 커밋을 살펴보겠습니다.

cd ~/project/main-repo
git ls-files --stage libs/libgit2-backends

출력은 메인 저장소가 추적하는 서브모듈의 특정 커밋인 커밋 해시를 표시합니다.

서브모듈 업데이트

서브모듈로 작업할 때 일반적인 작업 중 하나는 서브모듈을 원격 저장소와 최신 상태로 유지하는 것입니다. 서브모듈을 업데이트하는 방법을 알아보겠습니다.

서브모듈 초기화 및 업데이트

서브모듈을 포함하는 저장소를 방금 복제한 경우 서브모듈을 초기화하고 업데이트해야 합니다. 기존 저장소의 경우 다음 프로세스를 시연할 수 있습니다.

cd ~/project/main-repo
git submodule init
git submodule update

init 명령은 서브모듈 구성을 초기화하고, update 명령은 데이터를 가져와 메인 저장소에 지정된 커밋을 체크아웃합니다.

이러한 명령을 결합할 수도 있습니다.

git submodule update --init

서브모듈을 최신 원격 버전으로 업데이트

서브모듈을 원격 저장소의 최신 커밋으로 업데이트하려면 다음을 사용할 수 있습니다.

cd ~/project/main-repo
git submodule update --remote libs/libgit2-backends

이 명령은 원격 저장소에서 최신 변경 사항을 가져와 서브모듈을 업데이트합니다. Git 이 변경 사항을 가져오고 있음을 나타내는 출력을 볼 수 있습니다.

이 명령을 실행한 후 서브모듈의 상태를 확인해 보겠습니다.

git submodule status

이제 출력의 시작 부분에 더하기 기호 (+) 가 표시되어 서브모듈의 체크아웃된 커밋이 메인 저장소에 기록된 것과 다름을 나타냅니다.

+abcdef1234567890abcdef1234567890abcdef12 libs/libgit2-backends (origin/HEAD)

메인 저장소에 대한 변경 사항을 확인하려면 다음을 실행합니다.

git status

서브모듈이 수정되었음을 나타내는 출력을 볼 수 있습니다.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   libs/libgit2-backends (new commits)

업데이트된 서브모듈 참조 커밋

메인 저장소에 업데이트된 서브모듈 상태를 기록하려면 변경 사항을 추가하고 커밋해야 합니다.

git add libs/libgit2-backends
git commit -m "Update libgit2-backends submodule to latest version"

출력은 새 서브모듈 참조를 성공적으로 커밋했음을 나타냅니다.

업데이트된 상태 확인

업데이트된 서브모듈 참조를 커밋한 후 상태를 다시 확인해 보겠습니다.

git submodule status

출력은 더 이상 시작 부분에 더하기 기호가 없어야 하며, 이는 서브모듈이 이제 메인 저장소에 기록된 것과 동기화되었음을 나타냅니다.

 abcdef1234567890abcdef1234567890abcdef12 libs/libgit2-backends (origin/HEAD)

서브모듈 업데이트 옵션 이해

git submodule update 명령에는 업데이트 수행 방식을 제어하는 여러 옵션이 있습니다.

  • --remote: 원격 추적 브랜치의 최신 커밋으로 업데이트
  • --merge: 현재 브랜치가 원격보다 뒤쳐져 있는 경우 변경 사항 병합
  • --rebase: 현재 브랜치가 원격보다 뒤쳐져 있는 경우 변경 사항 리베이스
  • --recursive: 중첩된 서브모듈도 업데이트

대부분의 기본 사용 사례의 경우 git submodule update --remote가 충분합니다.

서브모듈 변경 사항 작업

때로는 서브모듈 내의 변경 사항으로 작업해야 합니다. 이 단계에서는 서브모듈 내에서 변경 사항을 만들고 관리하는 방법을 배우겠습니다.

서브모듈로 이동

서브모듈로 작업하려면 해당 디렉토리로 이동해야 합니다.

cd ~/project/main-repo/libs/libgit2-backends

여기에서 표준 Git 명령을 사용하여 서브모듈 저장소에 대한 정보를 볼 수 있습니다.

git status
git log -3 --oneline

git status 명령은 서브모듈 저장소의 현재 상태를 표시하고, git log는 최근 커밋을 표시합니다.

서브모듈에서 변경 사항 만들기

서브모듈의 파일에 간단한 변경 사항을 만들어 보겠습니다. 먼저 새 파일을 만들어 보겠습니다.

echo "## My notes on libgit2-backends" > NOTES.md

이제 변경 사항의 상태를 확인해 보겠습니다.

git status

추적되지 않은 파일이 있음을 나타내는 출력을 볼 수 있습니다.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        NOTES.md

이 변경 사항을 서브모듈에 추가하고 커밋해 보겠습니다.

git add NOTES.md
git commit -m "Add notes file"

서브모듈 내에서 커밋을 확인하는 출력을 볼 수 있습니다.

메인 저장소에서 상태 확인

이제 메인 저장소로 돌아가서 상태를 확인해 보겠습니다.

cd ~/project/main-repo
git status

서브모듈이 수정되었음을 나타내는 출력을 볼 수 있습니다.

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   libs/libgit2-backends (new commits)

메인 저장소에서 서브모듈 변경 사항 커밋

메인 저장소에 서브모듈의 새 상태를 기록하려면 변경 사항을 추가하고 커밋해야 합니다.

git add libs/libgit2-backends
git commit -m "Update libgit2-backends with notes file"

출력은 새 서브모듈 참조를 성공적으로 커밋했음을 나타냅니다.

상세 서브모듈 변경 사항 보기

서브모듈의 변경 사항에 대한 자세한 정보를 보려면 다음을 사용할 수 있습니다.

git diff --submodule

이 명령은 각 변경된 서브모듈에서 추가되거나 제거된 커밋 범위를 표시합니다.

서브모듈 변경 사항 작업 요약

서브모듈의 변경 사항으로 작업할 때는 다음 워크플로우를 기억하십시오.

  1. 서브모듈 디렉토리로 이동
  2. 서브모듈 내에서 변경 사항을 만들고 커밋
  3. 메인 저장소로 돌아가기
  4. 업데이트된 서브모듈 참조를 추가하고 커밋

이 두 단계 커밋 프로세스 (먼저 서브모듈에서, 그 다음 메인 저장소에서) 는 서브모듈에 대한 변경 사항을 적절하게 추적하는 데 필수적입니다.

요약

이 튜토리얼에서는 Git 서브모듈을 사용하는 방법을 배웠으며, 상태 확인 및 업데이트에 중점을 두었습니다. 다음은 수행한 작업입니다.

  1. 메인 저장소를 만들고 서브모듈을 추가했습니다.
  2. 다양한 Git 명령을 사용하여 서브모듈의 상태를 확인하는 방법을 배웠습니다.
  3. 서브모듈을 원격 저장소의 최신 버전으로 업데이트했습니다.
  4. 서브모듈 내에서 변경 사항을 만들고 메인 저장소에서 해당 변경 사항을 적절하게 추적했습니다.

Git 서브모듈은 프로젝트 내에 외부 저장소를 포함하는 강력한 방법을 제공하여 종속성을 효율적으로 관리할 수 있도록 합니다. 상태를 확인하고 업데이트를 관리하는 방법을 이해함으로써 프로젝트가 종속성과 적절하게 동기화되도록 할 수 있습니다.

기억해야 할 주요 명령:

  • git submodule status - 서브모듈의 현재 상태 확인
  • git submodule update --remote - 서브모듈을 최신 버전으로 업데이트
  • git add <submodule-path> - 서브모듈 참조에 대한 변경 사항 스테이징
  • git diff --submodule - 서브모듈의 자세한 변경 사항 보기

이러한 기술을 통해 서브모듈을 통해 외부 코드를 통합하는 Git 저장소를 효과적으로 관리할 수 있습니다.