본문 바로가기

Git Submodule/Subtree 없이 외부 저장소 프로젝트에 포함하기

@HisaCat2025. 9. 15. 00:39

지금 진행중인 Unity 프로젝트에서, 개인적으로 사용하는 Package repository를 프로젝트에 추가해야 하는 상황이 생겼다.

또한 이 프로젝트를 진행하면서, 해당 repository에 변경사항을 자주 push해야하는 니즈 또한 생겼다.

다만 이는 개인적으로 사용하는 private repository이기에, 아래와 같은 제약사항이 있었다.

 

  1. 로컬 환경에서, 해당 Package에 변경사항을 자유로이 push/pull 이 가능해야 한다.
  2. 협업자들은 해당 Package repo의 접근권한을 가질 수 없다.
  3. 협업자가 Project를 clone했을 시, 해당 Package는 일반적인 파일로써 존재해야 한다.

기존 방식의 한계

일반적인 상황에선 Sumodule 및 Subtree를 사용하면 되지만,

필자의 경우엔 아래와 같은 이유로 사용을 할 수 없었다.

  • Submodule
    • 협업자들이 Package의 remote 접근 권한을 가져야 함으로 조건 2 위배.
  • Subtree
    • 모든 조건 만족
    • 하지만 커밋 수가 많아질수록 push속도가 기하급수적으로 느려지는 단점이 있음.
이번 Subtree 동작 특성상, 매번 추가 시점부터 현재 HEAD까지의 모든 커밋을 다 가져와,
실제 대상 repo의 변경사항만을 찾아 추출하려 하기 때문이다.
결과적으로 커밋 수가 늘어나면, README파일 한줄 수정에도 push에 10분 이상 걸리는 대참사가 발생한다 (...)

 

단순 Clone?

가장 간단(하면서 무식한)방법은, 그냥 하위 프로젝트를 실제로 git clone을 때려버리는 것이다.

하지만 이렇게 되면, git은 해당 repo를 일반적인 directory가 아닌, subproject로써 인식한다.

git clone 이후에 stage에 올리고 git status를 해 보면,

Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        new file:   Packages/MyPackage

nothing added to commit but untracked files present (use "git add" to track)

위와 같은 식으로, 일반적인 directory로써 인식되지 않는 것을 확인할 수 있다.

또한 diff를 확인하면, 내용이 'Subproject commit 462d...' 와 같은 식으로 채워져있는 것을 확인할 수 있을 것이다.

 

이는 git repo 하위에 위치하는 repo는 자동으로 Subproject로써 인식하는 .git의 기본 사양 때문이다.

.gitignore파일을 통해 해당 하위 repo의 .git 폴더를 무시하는 것 또한 불가능하다.

 

Subproject로써의 인식 우회

하지만 꼼수가 하나 있다.

Git이 대상 하위 Repo를 Subproject로써 인식하기 전에, 해당 폴더를 한 번이라도 Stage에 올리면,

이후부터 Git은 이후에 .git 폴더가 포함되든 어쩌든 이를 일반 디렉토리로써 취급한다.

 

이렇게 subproject로써의 인식을 우회하는 방법은:

  • Clone한 뒤에, git 폴더를 임시 이름으로 변경한 뒤에, stage하고 다시 원복하는 방법,
  • 미리 대상 경로에 아무 파일이나 생성하여 stage한 뒤, 해당 폴더를 삭제하고 Clone하는 방법

등이 있다.

 

적용법 (Git Alias를 통한 자동화)

위 과정을 Git Alias를 활용하여 자동화 해 두었으니, 필요하신 분은 쓰시라:

사용법

git embed <repo> <dir> [<git clone options>]
  • <repo>: 외부 저장소 주소
  • <dir> clone 대상 위치
  • 그 뒤에는 git clone에서 지원하는 옵션을 그대로 사용할 수 있음 (--branch, --depth 등)

예시:

# develop 브랜치 기준 clone
git embed git@github.com:hisacat/Sample-Package.git Packages/com.hisacat.sample-package --branch develop

 

HisaCat
@HisaCat :: ひさキャットの巣・히사캣의 둥지

カニのカはカオスのカ

뻘짓 좋아하는 게임 개발자

목차