์ค๋ต๊น ๐ช - ํ์ ํธ #4: Git Submodule - ์ฌ๋ฌ ๋ ํฌ๋ฅผ ํ ํ๋ก์ ํธ์์ ๋ค๋ฃจ๋ ๋ฒ
by its_TIMIGit์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ํ ํ๋ก์ ํธ์์ ์ฌ๋ฌ ๊ฐ์ ์ ์ฅ์๋ฅผ ํจ๊ป ๊ด๋ฆฌํด์ผ ํ๋ ์ํฉ์ด ์๊ธด๋ค.
์๋ฅผ ๋ค์ด, ๋๊ท๋ชจ ํ๋ก์ ํธ, MSA(Microservices Architecture), ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ง์ ๊ด๋ฆฌ ๋ฑ์ด ํด๋น๋๋ค.
์ด๋, ์ฌ๋ฌ ์ ์ฅ์๋ฅผ ํ๋์ ํ๋ก์ ํธ์์ ๊น๋ํ๊ฒ ์ ์งํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ธฐ๋ฅ์ด ๋ฐ๋ก Git Submodule์ด๋ค.
ํ์ง๋ง ๋ง์ ์ฌ์ฉํด๋ณด๋ ค ํ๋ฉด Git Submodule์ด ์ ๋ง ํ์ํ๊ฐ? ๋ผ๋ ๊ณ ๋ฏผ์ด ๋ค ์ ์๋ค.
Subtree, ํจํค์ง ๋งค๋์ (npm, pip, maven) ๊ฐ์ ๋์๋ ์๊ธฐ ๋๋ฌธ์ด๋ค.๐ค
์ด ๊ธ์์๋ Git Submodule์ด ๋ฌด์์ธ์ง, ์ธ์ ์ฌ์ฉํด์ผ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ค์ ๋ก ์ด๋ป๊ฒ ํ์ฉํ๋์ง ์์๋ณธ๋ค.
Git Submodule vs Git Subtree vs ํจํค์ง ๋งค๋์ , ๋ญ๊ฐ ๋ค๋ฅผ๊น?
Git Submodule์ ๋์ ํ๊ธฐ ์ ์ ๋น์ทํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ๋ค๊ณผ ๋น๊ตํด๋ณผ ํ์๊ฐ ์๋ค.
๋ฐฉ์ | ํน์ง | ์ฌ์ฉ ์ฌ๋ก |
Git Submodule | ๋ ๋ฆฝ์ ์ธ ๋ ํฌ๋ฅผ ๋งํฌํ์ฌ ๊ด๋ฆฌ | ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํฌํจ, ๋ ๋ฆฝ์ ์ธ ํ๋ก์ ํธ ์ ์ง |
Git Subtree | ์ธ๋ถ ๋ ํฌ์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ ๋ณํฉ | ์ฝ๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ฝ๊ฒ ๋ฐ์ํด์ผ ํ๋ ๊ฒฝ์ฐ |
ํจํค์ง ๋งค๋์ (npm, pip, maven ๋ฑ) | ๋ณ๋์ ํจํค์ง๋ก ๊ด๋ฆฌ | ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฒ์ ๋ณ๋ก ์ ์งํ๊ณ ์ถ์ ๋ |
ํ๋ง๋๋ก ์ ๋ฆฌํ๋ฉด?
• Submodule: ์ธ๋ถ ํ๋ก์ ํธ๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์งํ๋ฉด์ ํน์ ๋ฒ์ ์ํ๋ฅผ ๊ด๋ฆฌํด์ผ ํ ๋ ์ ์
• Subtree: ์ธ๋ถ ์ฝ๋๋ฅผ ๋ด ๋ ํฌ์ ํตํฉํ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ ์ฝ๊ฒ ๊ฐ์ ธ์์ผ ํ ๋ ์ ์
• ํจํค์ง ๋งค๋์ : ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ณ๋๋ก ์ ์งํ๋ฉฐ ์ฝ๊ฒ ์ค์น·๊ด๋ฆฌํ๊ณ ์ถ์ ๋ ์ ์
๊ทธ๋ฌ๋ฏ๋ก, ์๋ธ๋ชจ๋์ ๋ ๋ฆฝ์ ์ธ ํ๋ก์ ํธ๋ฅผ ํฌํจํ ๋ ์ ํฉํ์ง๋ง, ์์ฃผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด ์๋ธํธ๋ฆฌ๋ ํจํค์ง ๋งค๋์ ๊ฐ ๋ ๋์ ์ ์๋ค.
๐ ๏ธ Git Submodule ์ฌ์ฉ๋ฒ
1๏ธโฃ ์๋ธ๋ชจ๋ ์ถ๊ฐํ๊ธฐ
Submodule์ ์ถ๊ฐํ๋ ๊ธฐ๋ณธ ๋ช ๋ น์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
git submodule add <์๋ธ๋ชจ๋_๋ ํฌ_URL> <์๋ธ๋ชจ๋_๋๋ ํ ๋ฆฌ_๊ฒฝ๋ก>
์๋ฅผ ๋ค์ด, common-library๋ผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ libs/common-library ํด๋์ ์ถ๊ฐํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์คํํ๋ค.
git submodule add https://github.com/example/common-library.git libs/common-library
git commit -m "Add submodule: common-library"
์ด์ libs/common-library ํด๋์ common-library ๋ ํฌ๊ฐ ํฌํจ๋๋ค.
2๏ธโฃ ์๋ธ๋ชจ๋์ด ์๋ ํ๋ก์ ํธ๋ฅผ ํด๋ก ํ ๋
์๋ธ๋ชจ๋์ด ํฌํจ๋ ํ๋ก์ ํธ๋ฅผ ์๋กญ๊ฒ ํด๋ก ํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ธ๋ชจ๋์ด ํฌํจ๋์ง ์๋๋ค.
๋ฐ๋ผ์ ์๋ธ๋ชจ๋์ ํจ๊ป ๊ฐ์ ธ์ค๋ ค๋ฉด --recurse-submodules ์ต์ ์ ์ฌ์ฉํด์ผ ํ๋ค.
git clone --recurse-submodules <๋ ํฌ_URL>
์ด๋ฏธ ํด๋ก ํ ๊ฒฝ์ฐ, ์๋ธ๋ชจ๋์ ๊ฐ์ ธ์ค๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ค.
git submodule update --init --recursive
3๏ธโฃ ์๋ธ๋ชจ๋ ์ ๋ฐ์ดํธํ๊ธฐ
Submodule์ ๋ ๋ฆฝ์ ์ธ ์ ์ฅ์์ด๋ฏ๋ก, ๋ฉ์ธ ํ๋ก์ ํธ์ ์๋์ผ๋ก ๋๊ธฐํ๋์ง ์๋๋ค.
๋ฐ๋ผ์ ์ต์ ์ํ๋ก ์ ์งํ๋ ค๋ฉด ๋ค์ ๋ช ๋ น์ด๋ฅผ ์คํํด์ผ ํ๋ค.
git submodule update --remote
์๋ธ๋ชจ๋์ด ํน์ ๋ธ๋์น๋ฅผ ๋ฐ๋ผ๊ฐ๋๋ก ์ค์ ํ ์๋ ์๋ค.
cd <์๋ธ๋ชจ๋_๋๋ ํ ๋ฆฌ>
git checkout main
cd ..
git add <์๋ธ๋ชจ๋_๋๋ ํ ๋ฆฌ>
git commit -m "Update submodule to latest version"
4๏ธโฃ ์๋ธ๋ชจ๋ ์ญ์ ํ๋ ๋ฐฉ๋ฒ
์๋ธ๋ชจ๋์ ์ ๊ฑฐํ๋ ค๋ฉด ๋ช ๊ฐ์ง ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํ๋ค.
git submodule deinit -f libs/common-library
rm -rf .git/modules/libs/common-library
git rm -f libs/common-library
git commit -m "Remove submodule: common-library"
์ด์ ์๋ธ๋ชจ๋์ด ์์ ํ ์ ๊ฑฐ๋๋ค.
โ ๏ธ Git Submodule ์ฌ์ฉ ์ ์ฃผ์ํ ์
โ ๊ด๋ฆฌ ๋์ด๋ ์ฆ๊ฐ
: ์๋ธ๋ชจ๋์ ๊ธฐ๋ณธ Git ์ํฌํ๋ก์ฐ์๋ ๋ค๋ฅด๊ฒ ์๋ํ๋ฏ๋ก, ํ์๋ค์๊ฒ ์ถ๊ฐ์ ์ธ ํ์ต์ด ํ์ํ๋ค.
โ CI/CD ํ๊ฒฝ์์ ๋ฌธ์ ๋ฐ์ ๊ฐ๋ฅ์ฑ
: ์ผ๋ถ CI/CD ํ์ดํ๋ผ์ธ์์๋ ์๋ธ๋ชจ๋์ ์๋์ผ๋ก ๊ฐ์ ธ์ค์ง ์์ผ๋ฏ๋ก, .gitmodules๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์์งํด์ผ ํ๋ค.
โ ํ๋ก์ ํธ ์ ๋ฐ์ ์ธ ๋ณต์ก๋ ์ฆ๊ฐ
: ๋จ์ํ ํ๋ก์ ํธ๋ผ๋ฉด ์๋ธ๋ชจ๋๋ณด๋ค ํจํค์ง ๋งค๋์ ๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ํจ์ฌ ๊ฐ๋จํ ์ ์๋ค.
๐ ๋ง๋ฌด๋ฆฌํ๋ฉฐ…
Git Submodule์ ํ ํ๋ก์ ํธ์์ ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ Git ์ ์ฅ์๋ฅผ ํจ๊ป ๊ด๋ฆฌํด์ผ ํ ๋ ์ ์ฉํ ๊ธฐ๋ฅ์ด๋ค.
ํนํ ๋๊ท๋ชจ ํ๋ก์ ํธ๋ MSA ํ๊ฒฝ์์ ํน์ ๋ชจ๋์ ๋ ๋ฆฝ์ ์ผ๋ก ์ ์งํ ๊ฒฝ์ฐ ์ ์ ํ ์๋ฃจ์ ์ด ๋ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด,
โ ์๋ธ๋ชจ๋์ด ์ ์ ํ ๊ฒฝ์ฐโ
โ ํน์ ์ธ๋ถ ํ๋ก์ ํธ๋ฅผ ์ ์งํ๋ฉด์๋ ๋ ๋ฆฝ์ ์ธ ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํด์ผ ํ ๋
โ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ง์ ํฌํจํ์ฌ ์ฌ์ฉํด์ผ ํ ๋
โ ํ๋ก์ ํธ ๊ฐ ๊ฐํ ์์กด์ฑ์ด ์๋ ๊ฒฝ์ฐ (ex: ๋ด๋ถ ๊ณตํต ๋ผ์ด๋ธ๋ฌ๋ฆฌ)
์ ์ ํ๋ค.
ํ์ง๋ง, ์๋ธ๋ชจ๋์ ๊ณผํ๊ฒ ์ฌ์ฉํ๋ฉด ํ๋ก์ ํธ๊ฐ ๋ถํ์ํ๊ฒ ๋ณต์กํด์ง ์ ์์ผ๋ฏ๋ก ์ ์คํ๊ฒ ๋์ ํ๋ ๊ฒ์ด ์ค์ํ๋ค.
๊ฒฐ๊ตญ, ํ ๋ด์์ ์๋ธ๋ชจ๋์ด ๊ผญ ํ์ํ์ง ๋ ผ์ํ๊ณ ๊ฒฐ์ ํ๋ ๊ฒ์ด ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ด๋ค.
๋ค์ ๊ธ์์๋ Git Subtree์์ ์ฐจ์ด์ ๊ณผ ์ค์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๋ ๊น์ด ๋ถ์ํ ์์ ์ด๋ค.
'์ค๋ต ๊น๐ช > ํ์ ํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ธ๋ก๊ทธ์ ์ ๋ณด
Dev_TIMI
its_TIMI