๐ก ๋ณธ ๋ฌธ์๋ '[Git] git submodule ์๋ธ๋ชจ๋ ํ์ฉํ๊ธฐ'์ ๋ํด ์ ๋ฆฌํด๋์ ๊ธ์ ๋๋ค.
git์ ์ฌ์ฉํ๋ค๋ณด๋ฉด ํน์ ํด๋๋ฅผ ๊ณตํต๋ชจ๋๋ก ๊ด๋ฆฌํ๊ณ ์ถ๋ค๋ ์๊ฐ์ด ๋ญ๋๋ค. ์ด๋ด ๋ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด git submodule์ด๋ฉฐ, 'submodule์ด ์ ์ฉ๋์ด ์๋ ๋ ํฌ์งํ ๋ฆฌ ํด๋ก ํ๋ ๋ฐฉ๋ฒ', 'submodule ์ถ๊ฐ/์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ', 'ํน์ ํด๋๋ฅผ submodule๋ก ์ถ์ถํ๋ ๋ฐฉ๋ฒ'์ ๋ํด ์์ธํ ์ ๋ฆฌํ์์ผ๋ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
1. submodule ์ ํฌํจํ git์์ ์์ ํ๊ธฐ
1) submodule ์ ํฌํจํ๋ git ์ ์ฅ์๋ฅผ clone ํ๊ธฐ
submodule ์ ์ฌ์ฉํ๋ ์ ์ฅ์๋ฅผ clone ํ๋ ๊ฒฝ์ฐ, init ๊ณผ ํจ๊ป update ๋ฅผ ์ํ์ด ํ์ํ๋ค.
$ git clone --recursive https://github.com/username/repo.git
์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ๋ฉด ํด๋น ์ ์ฅ์๊ฐ ์ฐธ์กฐ์ค์ธ submodule ๋ค์ ๊ฐ์ด clone ํ์ฌ ์ ์ ํ ๊ฒฝ๋ก์ ์์น์์ผ ์ค ๊ฒ์ด๋ค (submodule ์ ํฌํจํ๋ submodule ์ญ์ ํจ๊ป ์ฒ๋ฆฌ๋๋ค).
$ git clone https://github.com/username/repo.git
$ git submodule update --init --recursive
์ด๋ฌํ ๋ฐฉ๋ฒ์ ํต์์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก clone ์ ์ํํ ์งํ git submodule update --init --recursive ๋ช ๋ น์ด๋ฅผ ์คํํ๋ ๊ฒ๊ณผ ๋์ผํ ํจ๊ณผ๋ฅผ ๊ฐ๋๋ค.
2) submodule ์ ์ต์ ๋ฒ์ ์ผ๋ก updateํํ, master๋ฅผ push
submodule ์์ ์ ๋ถ๋ชจ ํ๋ก์ ํธ ๋ด๋ถ์์ ์์ ํ๋๋ผ๋ submodule ์์ฒด๋ฅผ ์ ๋ฐ์ดํธ ํด์ค์ผ ์์ ๋ด์ฉ์ด ๋ฐ์๋ฉ๋๋ค.
$ cd <submodule path>
$ git pull
$ git status
$ git add band
$ git commit -m "updated band"
$ git push
๋ถ๋ชจ repo์์ ์์ ํ๋ก์ ํธ ์์ ์ ์ฃผ์ํ ์ !!
์์ ํ๋ก์ ํธ ์์ ํ, ๋ฆฌ๋ชจํธ์ ์ปค๋ฐํ์ง ์๊ณ git submodule updateํ๋ฉด, ๋ถ๋ชจ repo๊ฐ ์ฐธ์กฐํ๋ ์ปค๋ฐ์ผ๋ก ์ฒดํฌ์์๋์ด, ์์ ๋ด์ฉ์ด ์ญ์ ๋ฉ๋๋ค!!
์ปค๋ฐ๋ง ํ๊ณ ํธ์ํ์ง ์์ ์ํ๋ผ๋ฉด, ๋ก์ปฌ ์ปค๋ฐ์์ ์ฐพ์ ์๋ ์์ผ๋, ๋ณ๋ ๋ธ๋์น๊ฐ ์์ผ๋ฉด ์ฐพ๊ธฐ ์ด๋ ต๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์, ๋ถ๋ชจ repo์์ ์์ ํ๋ก์ ํธ ์์ ์, ๋ฐ๋์ ๋ณ๋ ๋ธ๋์น๋ฅผ ๋ฐ์ ์์ ํ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
3) submodule ์ํ ํ์ธ
submoudle status๋ช ๋ น์ ํ์ฌ sub ๋ชจ๋์ด ๊ฐ๋ฆฌํค๋ ์ปค๋ฐ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
$ git submodule status
2. submodule ์ถ๊ฐ, ์ ๋ฐ์ดํธ ๋ฐ ์ ๊ฑฐํ๊ธฐ
1) submodule ์ถ๊ฐํ๊ธฐ
๋ค๋ฅธ ์ ์ฅ์์ ์๋ paper์ด๋ผ๋ ํ๋ก์ ํธ๋ฅผ ์์ ์ค์ธ ์ ์ฅ์์ ์๋ธ๋ชจ๋๋ก ์ถ๊ฐํ๋ ค๊ณ ํ ๊ฒฝ์ฐ, ์๋์ ๊ฐ์ด git submodule add <repository> [path]์ ์ฌ์ฉํ์ฌ submodule์ addํ๋ฉด ๋ฉ๋๋ค.
$ git submodule add https://github.com//paper paper
git status๋ฅผ ํ์ธํด๋ณด๋ฉด .gitmodule๊ณผ paperํด๋๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ํ์ธํ ์ ์๊ณ , .gitmodule ์๋ git์์ ๊ด๋ฆฌ๋๋ ์๋ธ๋ชจ๋์ ์ ๋ณด๊ฐ ๋ค์ด์๊ณ , ์๋ ๋ด์ฉ์ด ์ถ๊ฐ๋ฉ๋๋ค.
[submodule "paper"]
path = paper
url = https://github.com//paper.git
branch = master
.git/config ์๋ ์๋ ๋ด์ฉ์ด ์ถ๊ฐ๋ฉ๋๋ค.
[submodule "paper"]
url = https://github.com//paper.git
์ด ๋ shot์๋ paper๋ผ ํด๋๊ฐ ์์ฑ๋์ง๋ง, ๊ทธ ์์๋ ์๋ฌด๊ฒ๋ ์๊ธฐ ๋๋ฌธ์, submodule update๋ฅผ ์ฌ์ฉํ์ฌ paper์ ๋ด์ฉ์ ๋ช ์์ ์ผ๋ก ๋ค์ด๋ก๋ํฉ๋๋ค (์๋ฒ์ git์์๋ ์๋ ๋ค์ด๋ก๋ํฉ๋๋ค)
$ git submodule update --init --recursive
๋ชจ๋ ๊ฒ์ด ์ ๋์๋ค๋ฉด, ๋ณ๊ฒฝ์ ์ ์ปค๋ฐํ๊ณ paperํด๋๋ฅผ shot์ ์ฅ์์ ์ถ๊ฐํฉ๋๋ค.
gitHub์ paperํด๋ ์์ด์ฝ์ ์์ ํ์๋ฅผ ๋ถ์ฌ ์ด๊ฒ์ด ์๋ธ๋ชจ๋์์ ๋ํ๋ ๋๋ค.
2) submodule ์ ๋ฐ์ดํธํ๊ธฐ
๋ค์์ ๋ช ๋ น์ ํตํด ๋ด๋ถ์ ํฌํจ๋์ด ์๋ submodule์ ์ต์ ์ปค๋ฐ์ผ๋ก ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
$ git submodule foreach git pull --rebase
3) submodule ์ ๊ฑฐํ๊ธฐ
์ญ์ ๋ deinit ๋ช ๋ น์ผ๋ก ํด๋น ๋ชจ๋์ ์ด๊ธฐํํ๊ณ , rm ๋ช ๋ น์ผ๋ก ํด๋น ํด๋๋ฅผ ์ญ์ ํ, git rm ๋ช ๋ น์ผ๋ก git์์๋ ํด๋น ํด๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
$ git submodule deinit -f band
$ rm -rf .git/modules/band
$ git rm -f band
3. ํ์ ํด๋๋ฅผ ์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ๋ถํ (git submodule ํ์ฉ)
magician ์ด๋ผ๋ ์ ๊ท ํ๋ก์ ํธ๋ฅผ ์์ํ๊ธฐ๋ก ํ๋๋ฐ, ์ฌ๊ธฐ์ band๊ฐ ์ ์ฉํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. shot์ ์ํด ๋ง๋ band๋ฅผ ๋ ๋ฆฝ์ ์ธ ์ ์ฅ์๋ก ๋ถ๋ฆฌํ ํ, ๋ ๊ฐ์ ํ๋ก์ ํธ์ ์๋ธ๋ก ์ถ๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
band๋ฅผ shot์์ ์ถ์ถํ๋ ค๋ฉด, git filter-branch ๋ช ๋ น์ผ๋ก band ๊ด๋ จ๋ ์ปค๋ฐ๋ง ๋จ๊ธธ ์ ์์ต๋๋ค. ์ด๋ ์ ์ฅ์ ์ด๋ ฅ์ ์ฌ์์ฑํ์ฌ band๊ฐ ์๋ ์ ์ฅ์์ ํฌํจ๋์ง ์์ ๊ฒ์ฒ๋ผ ๋ณด์ด๊ฒ ํฉ๋๋ค.
1) A ์ด๋ฆ์ local ์ ์ฅ์ ์์ฑ
shot ์์ band๋ฅผ ์์ฒด ์ ์ฅ์๋ก ๋์ํ๊ฒ ํ๊ธฐ ์ํด shot ๋ณต์ฌ๋ณธ์ band์ด๋ฆ์ผ๋ก ์์ฑํฉ๋๋ค.
cd ..
cp -r shot band
2) A ๊ด๋ จ ํด๋ ๋ฐ ํ์คํ ๋ฆฌ๋ง ์ถ์ถ
์ด์ band ํด๋์ ํ์ผ๊ณผ ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ง ๋จ๊น๋๋ค.
์ฌ์ฉ ๋ฐฉ๋ฒ์ git filter-branch --subdirectory-filter <folder name> <branch name> ์
๋๋ค.
cd band
git filter-branch --subdirectory-filter band -- --all
3) A ์ด๋ฆ์ remote ์ ์ฅ์ ์์ฑ ๋ฐ update
github์์ band๋ผ๋ ์๋ก์ด ์ ์ฅ์๋ฅผ ๋ง๋ค๊ณ remote๋ฅผ band๋ก updateํฉ๋๋ค.
git remote -v
git remote set-url origin https://github.com//band
git push -u origin master
4) ์๋ณธ ์ ์ฅ์์์ A ํด๋ ์ญ์
shot์ ์ฅ์์์ bandํด๋๋ฅผ ์ญ์ ํฉ๋๋ค
git rm -r band
git commit -m "Remove band (preparing for submodule)"
5) A๋ฅผ ๋ถ๋ชจ ์ ์ฅ์์ submodule๋ก ์ถ๊ฐ
shot์ band๋ฅผ ์๋ธ๋ชจ๋๋ก ๋ง๋ญ๋๋ค
git submodule add https://github.com//band band
git commit -m "band submodule"
์ด์ , ๋ถ๋ชจ ์ ์ฅ์์ธ shot', ๋๊ฐ์ ์๋ธ ์ ์ฅ์์ธ paper๊ณผ band`๋ฅผ ํฌํจํ ์ธ๊ฐ์ ์ ์ฅ์๊ฐ ๋ฉ๋๋ค. shot ํ์คํ ๋ฆฌ๋ฅผ ๋ณด๋ฉด, band๊ฐ ํด๋์ผ ๋ ๋ง๋ค์๋ ์ปค๋ฐ๋ค์ด ๋จ์์์ต๋๋ค. ์ฆ, ํด๋๋ฅผ ์ญ์ ํ๋๋ผ๋ ํ์คํ ๋ฆฌ๊ฐ ์ญ์ ๋์ง ์์ต๋๋ค.
์ฐธ๊ณ
- [Blog] git ์๋ธ๋ชจ๋: ์ถ๊ฐํ๊ธฐ, ๋ณ๊ฒฝํ๊ธฐ,์ญ์ ํ๊ธฐ: https://yztech.tistory.com/95
- [Blog] 9.1: submodule ์ ํฌํจํ๋ git ์ ์ฅ์๋ฅผ clone ํ๊ธฐ: https://nochoco-lee.tistory.com/87
- [Official Docs] Github ํ์ ํด๋๋ฅผ ์ ๋ฆฌํฌ์งํ ๋ฆฌ๋ก ๋ถํ : https://docs.github.com/ko/get-started/using-git/splitting-a-subfolder-out-into-a-new-repository
- [Blog] 9.2: submodule ๊ฐฑ์ (update) ํ๊ธฐ: https://nochoco-lee.tistory.com/88