-
[Git] Repo ์ค์น ๋ฐ ์ฌ์ฉGit 2021. 2. 12. 21:05๋ฐ์ํ
Repo๋?
- Repo๋ ํ์์ ์ฌ๋ฌ๊ฐ์ง Git repository๋ฅผ ํตํฉํ์ฌ Android ๊ฐ๋ฐ workflow๋ฅผ ์๋ํํฉ๋๋ค.
- Repo๋ Git์ ๋์ฒดํ๋ ๊ฒ์ด ์๋ Android์ ์ปจํ ์คํธ์์ Git์ ์ฝ๊ฒ ์์ ํ ์ ์๋๋ก ํ๋๋ฐ ๋ชฉ์ ์ด ์์ต๋๋ค.
- Repo๋ manifest ํ์ผ์ ์ด์ฉํ์ฌ Android ํ๋ก์ ํธ์ Git ํ๋ก์ ํธ๋ฅผ ๋ชจ์๋ก๋๋ค.
- repo ๋ช ๋ น์ด๋ ๊ฒฝ๋ก ์ด๋์๋ ์ฝ์ ํ ์ ์๋ ์คํ ๊ฐ๋ฅํ Python ์คํฌ๋ฆฝํธ์ ๋๋ค.
- ์ฐธ์กฐ(https://source.android.com/setup/develop#installing-repo)
Repo ์ค์น
# Debian/Ubuntu $ sudo apt-get install repo # Gentoo. $ sudo emerge dev-vcs/repo
๋ง์ ๋ฐฐํฌํ์ repo๊ฐ ํฌํจ๋์ด ์์ผ๋ฏ๋ก ๋ฐ๋ก ์ค์น๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
$ mkdir -p ~/.bin $ PATH="${HOME}/.bin:${PATH}" $ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/.bin/repo $ chmod a+rx ~/.bin/repo
repo ๋ช ๋ น์ด๋ค์ด python ์คํฌ๋ฆฝํธ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
Manifest ํ์ผ
- repo manifest ํ์ผ์ Git์์ ๋ฐ์ ์ ์๋ ํด๋๋ค์ ๋ํ repo ํด๋ผ์ด์ธํธ์ ๊ตฌ์กฐ๋ฅผ ์ค๋ช ํฉ๋๋ค.
- manifest์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ ์ต์์ ํด๋์ default.xml ํ์ผ์ ๊ฐ์ง๊ณ ์๋ Git ์ ์ฅ์์ ๋๋ค.
- manifest๋ Git ์ ์ฅ์์ ๋ณด๊ด๋๋ฏ๋ก ๋ฒ์ ๊ด๋ฆฌ๋ฅผ ํ ์ ์์ผ๋ฉฐ, repo sync๋ฅผ ํตํด ๋ชจ๋ Git ์ ์ฅ์์ ๋ณ๊ฒฝ์ฌํญ์ ๊ฐ์ ธ์ต๋๋ค.
# default.xml <?xml version="1.0" encoding="UTF-8"?> <manifest> <remote name="origin" fetch="ssh://git@github.com"/> <default revision="master" remote="origin"/> <project path="Item1" name="ows3090/RepoItem1"/> <project path="Item2" name="ows3090/RepoItem2"/> <project path="Item3" name="ows3090/RepoItem3"/> </manifest>
- RepoTest๋ผ๋ ์๊ฒฉ ์ ์ฅ์์ ๋ค์ default.xml ํ์ผ์ด ์กด์ฌํฉ๋๋ค.
- manifest ํ์ผ์ ์ด๋ฆ์ ๋ฌด์กฐ๊ฑด default.xml์ผ ํ์๋ ์๊ณ , ๋ค๋ฅธ ์ด๋ฆ์ ํ ๊ฒฝ์ฐ repo init์์ -m ์ต์ ์ผ๋ก ํ์ผ๋ช ์ ์๋ ค์ค์ผ ํฉ๋๋ค.
- ํ์ผ๋ช ์ ์ ์ง ์์ ๊ฒฝ์ฐ default.xml ํ์ผ๋ช ์ manifest ํ์ผ๋ก ๊ฐ์ฃผํฉ๋๋ค.
< manifest >
ํ์ผ ๋ฃจํธ ์์< remote >
ํ๋ ์ด์์ remote element๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ๊ตต๊ฒ ํ์ํ ํ๊ทธ๋ ํ์๋ก ์์ด์ผ ํ ํ๊ทธ๋ค์ ๋๋ค.- name : manifest file์์ ์ ์ผํ ์ด๋ฆ์ผ๋ก ๊ฐ ํ๋ก์ ํธ์ .git/config์ ์ ํ์๋ ์๊ฒฉ ์ ์ฅ์์ผ๋ก ์ง์ ๋ ์ด๋ฆ
- fetch : ์ด remote ์ฌ์ฉํ๋ ๋ชจ๋ ํ๋ก์ ํธ์ Git URL prefix, ์ด prefix์ project์ name์ด ์ถ๊ฐ๋์ด cloneํฉ๋๋ค.
- alias : name์ ์ ํ์๋ ์๊ฒฉ ์ ์ฅ์ ์ด๋ฆ์ overrideํ ์ด๋ฆ
- pushurl : ์ด remote๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ project๋ค์ ๋ํ Git push ULR prifix, ์ด preifx์ project์ name์ด ์ถ๊ฐ๋์ด pushํฉ๋๋ค. pushurl์ด ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ fetch URL๋ก push ๋ฉ๋๋ค.
- review : repo upload ์ review ์์คํ ์ ์ ๋ก๋ํ gerrit์ ํธ์คํธ ๋ค์
- revision : Git branch ์ด๋ฆ
< default >
default element๋ ์ค์ง ํ๋๋ง ๊ธฐ์ ํฉ๋๋ค. project ํ๊ทธ๊ฐ ์์ ์ remote ๋๋ revision ์์ฑ์ ๊ฐ์ง์ง ์์ ๊ฒฝ์ฐ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ด ์ ๋ณด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๊ตต๊ฒ ํ์ํ ํ๊ทธ๋ ํ์๋ก ์์ด์ผ ํ ํ๊ทธ๋ค์ ๋๋ค.- remote : remote element์ ์ ์๋ ์๊ฒฉ ์ ์ฅ์ ์ด๋ฆ
- revision : project์ revision ์์ฑ์ด ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ Git branch ์ด๋ฆ
- dest-branch : project์ des-branch ์์ฑ์ด ์๋ ๊ฒฝ์ฐ ์ฌ์ฉ๋๋ Git branch ์ด๋ฆ
- sync-j : sync ์์ ์ ๋ณ๋ ฌ๋ก ์์ ํ ๊ฐฏ์
- sync-c : true์, revision์ ์ฃผ์ด์ง git branch๋ง sync ํฉ๋๋ค.
- sync-s : true์, sub-project๋ sync ํฉ๋๋ค.
< project >
project element๋ ํ๋ ์ด์ ๊ธฐ์ ํ ์ ์์ต๋๋ค. ๊ฐ element๋ ์๊ฒฉ ์ ์ฅ์์ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฉฐ, ํด๋น git repository์ cloneํฉ๋๋ค. ๊ตต๊ฒ ํ์ํ ํ๊ทธ๋ ํ์๋ก ์์ด์ผ ํ ํ๊ทธ๋ค์ ๋๋ค.- name : project ์ด๋ฆ, Git remote URL์ ${remote_fetch}/${project_name}.git ์ผ๋ก ์ค์ ๋ฉ๋๋ค.
- path : ์ต์์ ๋๋ ํ ๋ฆฌ๋ก๋ถํฐ์ ์๋์ ์ธ ๊ฒฝ๋ก, ์ด ๊ฒฝ๋ก์ project๊ฐ clone ๋ฐ์์ง๋๋ค. ๋ง์ฝ ์์ฑ์ด ์๋ ๊ฒฝ์ฐ project ์ด๋ฆ์ผ๋ก ํด๋ ์์ฑํ์ฌ ๋ฐ์ต๋๋ค.
- remote : remote ํ๊ทธ์ ์ ์๋ name
- revision : ์ด project๊ฐ tracking ํ๊ธธ ์ํ๋ Git branch ์ด๋ฆ
- dest-branch : repo upload์์ ์ฌ์ฉ๋ Git branch ์ด๋ฆ
- groups : ์ด project๊ฐ ์ํด ์๋ group ๋ฆฌ์คํธ
- sync-c : true์, revision์ ์ฃผ์ด์ง git branch๋ง sync ํฉ๋๋ค.
- sync-s : true์, sub-project๋ sync ํฉ๋๋ค.
- ์ฐธ์กฐ(https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.md)
repo์ init ๋ช ๋ น์ด
$ repo init -u url [options]
ํ์ฌ ํด๋์ Repo๋ฅผ ์ค์นํฉ๋๋ค. ์ด ๋ช ๋ น์ด๋ Repo ์์ค ์ฝ๋ ๋ฐ ํ์ค Android manifest ํ์ผ์ Git ์ ์ฅ์๊ฐ ํฌํจ๋ .repo ํด๋๋ฅผ ์์ฑํฉ๋๋ค.
- -u : manifest๊ฐ ์๋ ์ ์ฅ์ URL์ ์ง์ ํฉ๋๋ค.
- -m : ์ ์ฅ์์์ manifest ํ์ผ์ ์ ํํฉ๋๋ค. manifest ์ด๋ฆ์ ์ง์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ด default.xml์ ๋๋ค.
- -b : branch๋ช ์ ์ง์ ํฉ๋๋ค.
- ์์ธํ ์ต์ ์ ๋ํ ์ค๋ช ์ ๊ณต์๋ฌธ์ ํ์ธํ๋ฉด ๋ฉ๋๋ค.
repo์ sync ๋ช ๋ น์ด
$ repo sync [project-list] [options]
์๋ก์ด ๋ณ๊ฒฝ์ฌํญ์ ๋ค์ด๋ก๋ํ์ฌ ๋ก์ปฌ ํ์ผ๋ค์ ์ ๋ฐ์ดํธํ๋๋ก ์ ์ฒด Git ์ ์ฅ์์ ๊ฑธ์ณ git fetch๋ฅผ ์คํํฉ๋๋ค. project-list๋ฅผ ๋ช ์ํ์ง ์์ผ๋ฉด repo sync ์คํ ์ ๋ชจ๋ ํ๋ก์ ํธ ํ์ผ์ sync ํฉ๋๋ค.
# ํ๋ก์ ํธ๊ฐ sync ๋ ์ ์ด ์์ ๊ฒฝ์ฐ, git clone ๊ณผ ๊ฐ์ด ์๊ฒฉ ์ ์ฅ์์ ํ์ผ์ด ๋ก์ปฌ ํ์ผ๋ก ๋ณต์ฌ๋ฉ๋๋ค. $ git clone # ์ด์ ์ ํ๋ก์ ํธ๊ฐ sync ๋ ์ ์ด ์์ ๊ฒฝ์ฐ $ git remote update $ git rebase origin/branch
- -c : manifest branch๋ง ๊ฐ์ ธ์ต๋๋ค.
- -j : repo sync๋ฅผ ์ฌ๋ฌ ์ค๋ ๋๋ก ๋ถํ ํ์ฌ ์๋ฃ ์๊ฐ์ ๋จ์ถํฉ๋๋ค. ์ฌ์ฉ ๊ฐ๋ฅํ CPU ์๋ฅผ ๋ณด๊ธฐ ์ํด์๋ nproc --all ์ ๋ ฅํด์ ํ์ธํ ์ ์์ต๋๋ค.
- ์์ธํ ์ต์ ์ ๋ํ ์ค๋ช ์ ๊ณต์๋ฌธ์ ํ์ธํ๋ฉด ๋ฉ๋๋ค.
manifest ๊ณ์ธต ๊ตฌ์กฐ
AOSP๋ฅผ repo๋ฅผ ํตํด ๋ค์ด๋ก๋ ๋ฐ์ ์ ๋ชจ๋ ํ๋ก์ ํธ๋ฅผ ๋ฐ์ ํ์๋ ์์ต๋๋ค.
remove-project ํ๊ทธ๋ฅผ ์ด์ฉํ์ฌ ํ์ํ์ง ์๋ ํ๋ก์ ํธ๋ ์ ์ธํ์ฌ ๋ฐ์ ์ ์์ต๋๋ค. ํ์ง๋ง default.xml์ project ํ๊ทธ ์ค๊ฐ์ ๋ฃ๋ ๋ฐฉ๋ฒ์ ๋์ค์ rebase์ ์ถฉ๋์ด ๋ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋ก์ด xml์ ์์ฑํ์ฌ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ๋ง๋ฆ์ผ๋ก์จ ํด๊ฒฐํ ์ ์์ต๋๋ค.<?xml version="1.0" encoding="UTF-8"?> <manifest> <remote name="origin" fetch="ssh://git@github.com"/> <default revision="master" remote="origin"/> <project path="Item1" name="ows3090/RepoItem1"/> <project path="Item2" name="ows3090/RepoItem2"/> <project path="Item3" name="ows3090/RepoItem3"/> <repo-hooks in-project="ows3090/RepoItem2" enabled-list="pre-upload"/> <include name="removeItem.xml"/> </manifest>
ows3090/RepoItem2์ ํ๋ก์ ํธ๋ฅผ ์ ์ธํ๊ณ ์ถ์ ๊ฒฝ์ฐ repo-hooks ํ๊ทธ์ include ํ๊ทธ๋ฅผ ํตํด ์ ์ธํ ์ ์์ต๋๋ค.
repo-hooks ํ๊ทธ๋ก ์ง์ ๋ ํ๋ก์ ํธ ์ด์ ์ include ๋๋ xml์ ์ถ๊ฐํ๋ค๋ ๋ป์ ๋๋ค.<?xml version="1.0" encoding="UTF-8"?> <manifest> <remove-project name="ows3090/RepoItem2"/> </manifest>
๋ค์์ removeItem.xml์ ๋๋ค. ์ฌ๊ธฐ์ removeํ ํ๋ก์ ํธ๋ฅผ ์ง์ ํ์ฌ ์ ์ธํ์์ต๋๋ค.
๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ด๋ Item2 ํ๋ก์ ํธ ์ ์ธํ๊ณ cloneํ์์ต๋๋ค.
๊ฐ์ข Repo ๋ช ๋ น์ด
๋ฐ์ํ'Git' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Git] Remote Repository ๋ช ๋ น์ด (0) 2021.05.30 [Git] Git Submodule(์๋ธ๋ชจ๋) ์ด๋? (0) 2021.02.03 [Git] SSH Key ์์ฑ ๋ฐ ์ค์ (0) 2020.12.11