Perforce๋ ๊ธฐ์ ์์ ๋ง์ด ์ฌ์ฉํ๋ ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ด๋ค. 1995๋ ๋ฌด๋ ต๋ถํฐ ์ฌ์ฉ๋์ผ๋ฉฐ ์ด ์ฅ์์ ๋ค๋ฃจ๋ ์์คํ ์ค์์ ๊ฐ์ฅ ์ค๋๋ ๋ฒ์ ๊ด๋ฆฌ ์์คํ ์ด๋ค. ์ฒ์ Perforce๋ฅผ ๋ง๋ ๋น์ ํ๊ฒฝ์ ๋ง๊ฒ ์ค๊ณํ๊ธฐ ๋๋ฌธ์ ๋ช ๊ฐ์ง ํน์ง์ด ์๋ค. ์ธ์ ๋ ์ค์ ์๋ฒ์ ์ฐ๊ฒฐํ ์ ์๊ณ ๋ก์ปฌ์๋ ํ ๋ฒ์ ๋ง ์ ์ฅํ๋ค. Perforce๊ฐ ์ ๋ง๋ ์ํฌํ๋ก๋ ์๊ฒ ์ง๋ง Git์ ๋์ ํ๋ฉด ํจ์ฌ ๋์ ์ํฌํ๋ก๋ฅผ ์ ์ฉํ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐํ๋ค.
Perforce์ Git์ ํจ๊ป ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๋ค. ์ฒซ ๋ฒ์งธ๋ Perforce๊ฐ ์ ๊ณตํ๋ โGit Fusionโ ์ด๋ค. Perforce Depot์ ์๋ธํธ๋ฆฌ๋ฅผ ์ฝ๊ณ ์ธ ์ ์๋ Git ์ ์ฅ์๋ก ๋ ธ์ถ ์์ผ ์ค๋ค. ๋ ๋ฒ์งธ ๋ฐฉ๋ฒ์ git-p4๋ผ๋ ํด๋ผ์ด์ธํธ Bridge๋ฅผ ์ฌ์ฉํ์ฌ Git์ Perforce์ ํด๋ผ์ด์ธํธ๋ก ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ์ด ๋ฐฉ๋ฒ์ Perforce ์๋ฒ๋ฅผ ๊ฑด๋๋ฆฌ์ง ์์๋ ๋๋ค.
Perforce๋ Git Fusion(http://www.perforce.com/git-fusion ์์ ๋ค์ด๋ก๋ ๋ฐ์ ์ ์์)์ด๋ผ๋ ์ ํ์ ์ ๊ณตํ๋ค. ์ด ์ ํ์ Perforce ์๋ฒ์ ์๋ฒ์ ์๋ Git ์ ์ฅ์๋ฅผ ๋๊ธฐํํ๋ค.
Perforce ๋ฐ๋ชฌ๊ณผ Git Fusion์ด ํฌํจ๋ ๊ฐ์ ๋จธ์ ์ด๋ฏธ์ง๋ฅผ ๋ด๋ ค๋ฐ๋ ๊ฒ์ด Git Fusion์ ๊ฐ์ฅ ์ฝ๊ฒ ์ค์นํ๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ฐ์๋จธ์ ์ด๋ฏธ์ง๋ http://www.perforce.com/downloads/Perforce/20-User ์ Git Fusion ํญ์์ ๋ฐ์ ์ ์๋ค. VirtualBox ๊ฐ์ ๊ฐ์ํ ์ํํธ์จ์ด๋ก ์ด ์ด๋ฏธ์ง๋ฅผ ๋์์ํฌ ์ ์๋ค.
๊ฐ์๋จธ์ ์ ์ฒ์ ๋ถํ
์ํค๋ฉด root, perforce, git ์ธ Linux ๊ณ์ ์ ์ํธ๋ฅผ ์
๋ ฅํ๋ผ๋ ํ๋ฉด๊ณผ ๊ฐ์๋จธ์ ์ธ์คํด์ค ์ด๋ฆ์ ์
๋ ฅํ๋ผ๋ ํ๋ฉด์ด ๋ํ๋๋ค. ์ธ์คํด์ค ์ด๋ฆ์ ๊ฐ์ ๋คํธ์ํฌ ์์์ ์ธ์คํด์ค๋ฅผ ๊ตฌ๋ถํ๊ณ ์ ๊ทผํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ด๋ฆ์ด๋ค.
์ด๋ฌํ ๊ณผ์ ์ ๋ง์น๊ณ ๋๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ ๋ณผ ์ ์๋ค.
ํ๋ฉด์ IP ์ฃผ์๋ ๊ณ์ ์ฌ์ฉํ ๊ฑฐ๋ผ์ ๊ธฐ์ตํด๋์ด์ผ ํ๋ค.
๋ค์์ Perforce ์ฌ์ฉ์๋ฅผ ์์ฑํด๋ณด์.
โLoginโ ํญ๋ชฉ์ผ๋ก ์ด๋ํด์ ์ํฐํค๋ฅผ ๋๋ฅด๋ฉด(๋๋ SSH๋ก ์ ์ํ๋ฉด) root ๋ก ๋ก๊ทธ์ธํ๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ ๋ช
๋ น์ผ๋ก Perforce ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ค.
$ p4 -p localhost:1666 -u super user -f john
$ p4 -p localhost:1666 -u john passwd
$ exit์ฒซ ๋ฒ์งธ ๋ช
๋ น์ ์คํํ๋ฉด VI ํธ์ง๊ธฐ๊ฐ ๋จ๊ณ ์์ฑํ ์ฌ์ฉ์์ ์ ๋ณด๋ฅผ ์์ ํ ์ ์๋ค. ๊ธฐ๋ณธ์ผ๋ก ์
๋ ฅ๋์ด์๋ ์ ๋ณด๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ ค๋ฉด ๊ฐ๋จํ :wq ๋ฅผ ํค๋ณด๋๋ก ์
๋ ฅํ๊ณ ์ํฐํค๋ฅผ ๋๋ฅธ๋ค.
๋ ๋ฒ์งธ ๋ช
๋ น์ ์คํํ๋ฉด ์์ฑํ Perforce ์ฌ์ฉ์์ ์ํธ๋ฅผ ๋ฌป๋๋ฐ ์์ ํ๊ฒ ๋ ๋ฒ ๋ฌป๋๋ค.
์์์ ํ๋ ์์
์ ์ฌ๊ธฐ๊น์ง์ด๋ฏ๋ก ์์์ ๋์จ๋ค.
๋ค์์ผ๋ก ํด์ผ ํ ์์ ์ ํด๋ผ์ด์ธํธ ํ๊ฒฝ์์ Git์ด SSL ์ธ์ฆ์๋ฅผ ๊ฒ์ฆํ์ง ์๋๋ก ์ค์ ํ๋ ๊ฒ์ด๋ค. Git Fusion ์ด๋ฏธ์ง์ ํฌํจ๋ SSL ์ธ์ฆ์๋ ๋๋ฉ์ธ ์ด๋ฆ์ผ๋ก ์ ์์ ๊ฒ์ฆํ๋ค. ์ฌ๊ธฐ์๋ IP ์ฃผ์๋ก ์ ๊ทผํ ๊ฑฐ๋ผ์ Git์ด HTTPS ์ธ์ฆ์๋ฅผ ๊ฒ์ฆํ์ง ๋ชปํ๋ค. ๊ทธ๋์ ์ ์ํ ์๋ ์๋ค. ์ด Git Fusion ๊ฐ์๋จธ์ ์ด๋ฏธ์ง๋ฅผ ์ค์ ๋ก ์ฌ์ฉํ ๊ฑฐ๋ผ๋ฉด Perforce Git Fusion ๋ฉ๋ด์ผ์ ์ฐธ๊ณ ํด์ SSL ์ธ์ฆ์๋ฅผ ์๋ก ์ค์นํด์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถํ๋ค. ๊ทธ๋ฅ ํด๋ณด๋ ๊ฑฐ๋ผ๋ฉด ์ธ์ฆ์ ๊ฒ์ฆ์ ์ํ๋ฉด ๋๋ค.
$ export GIT_SSL_NO_VERIFY=true์ ๋๋ก ์๋ํ๋์ง ์๋ ๋ช ๋ น์ผ๋ก ํ์ธํด๋ณด์.
$ git clone https://10.0.1.254/Talkhouse
Cloning into 'Talkhouse'...
Username for 'https://10.0.1.254': john
Password for 'https://john@10.0.1.254':
remote: Counting objects: 630, done.
remote: Compressing objects: 100% (581/581), done.
remote: Total 630 (delta 172), reused 0 (delta 0)
Receiving objects: 100% (630/630), 1.22 MiB | 0 bytes/s, done.
Resolving deltas: 100% (172/172), done.
Checking connectivity... done.Perforce๊ฐ ์ ๊ณตํ ๊ฐ์๋จธ์ ์ด๋ฏธ์ง๋ ์์ ์ํ ํ๋ก์ ํธ๊ฐ ํ๋ ๋ค์ด ์๋ค.
HTTPS ํ๋กํ ์ฝ๋ก ํ๋ก์ ํธ๋ฅผ Clone ํ ๋ Git์ ์ธ์ฆ์ ๋ณด๋ฅผ ๋ฌป๋๋ค. ์์ ๋ง๋ john ์ด๋ผ๋ ์ฌ์ฉ์์ด๋ฆ๊ณผ ์ํธ๋ฅผ ์
๋ ฅํ๋ค.
Credential ์บ์๋ก ์ฌ์ฉ์์ด๋ฆ๊ณผ ์ํธ๋ฅผ ์ ์ฅํด ๋๋ฉด ์ด ๋จ๊ณ๋ฅผ ๊ฑด๋๋ด๋ค.
Git Fusion์ ์ค์นํ๊ณ ๋์ ์ค์ ์ ๋ณ๊ฒฝํ ์ ์๋ค.
์ด๋ฏธ ์ ์ฐ๊ณ ์๋ Perforce ํด๋ผ์ด์ธํธ๊ฐ ์์ผ๋ฉด ๊ทธ๊ฑธ๋ก ๋ณ๊ฒฝํ ์ ์๋ค. Perforce ์๋ฒ์ //.git-fusion ๋๋ ํ ๋ฆฌ์ ์๋ ํ์ผ์ ์์ ํ๋ฉด ๋๋ค.
๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๋ ์๋์ ๊ฐ๋ค.
$ tree
.
โโโ objects
โย ย โโโ repos
โย ย โย ย โโโ [...]
โย ย โโโ trees
โย ย โโโ [...]
โ
โโโ p4gf_config
โโโ repos
โย ย โโโ Talkhouse
โย ย โโโ p4gf_config
โโโ users
โโโ p4gf_usermap
498 directories, 287 filesobjects ๋๋ ํ ๋ฆฌ๋ Git Fusion์ด Perforce ๊ฐ์ฒด์ Git์ ์๋ฐฉํฅ์ผ๋ก ๋์์ํค๋ ๋ด์ฉ์ ๋ด๊ณ ์์ผ๋ฏ๋ก ์ด ๋๋ ํ ๋ฆฌ ์์ ๋ด์ฉ์ ์์๋ก ์์ ํ์ง ๋ง์์ผ ํ๋ค.
p4gf_config ํ์ผ์ ๋ฃจํธ ๋๋ ํ ๋ฆฌ์, ๊ทธ๋ฆฌ๊ณ ๊ฐ ์ ์ฅ์๋ง๋ค ํ๋์ฉ ์์ผ๋ฉฐ Git Fusion์ด ์ด๋ป๊ฒ ๋์ํ๋์ง๋ฅผ ์ค์ ํ๋ ํ์ผ์ด๋ค.
๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ์ด ํ์ผ ๋ด์ฉ์ ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
[repo-creation]
charset = utf8
[git-to-perforce]
change-owner = author
enable-git-branch-creation = yes
enable-swarm-reviews = yes
enable-git-merge-commits = yes
enable-git-submodules = yes
preflight-commit = none
ignore-author-permissions = no
read-permission-check = none
git-merge-avoidance-after-change-num = 12107
[perforce-to-git]
http-url = none
ssh-url = none
[@features]
imports = False
chunked-push = False
matrix2 = False
parallel-push = False
[authentication]
email-case-sensitivity = no์ด ์ฑ
์์๋ ์ด ํ์ผ ๋ด์ฉ ํ ์ค ํ ์ค ๊ทธ ์๋ฏธ๋ฅผ ์ค๋ช
ํ์ง๋ ์๋๋ค. Git์์ ์ฌ์ฉํ๋ ํ๊ฒฝ์ค์ ํ์ผ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก INI ํ์์ผ๋ก ๊ด๋ฆฌ๋๋ค๋ ์ ์ ์์๋๋ฉด ๋๋ค.
๋ฃจํธ ๋๋ ํ ๋ฆฌ์ ์์นํ ์ด ํ์ผ์ ์ ์ญ ์ค์ ์ด๋ค. repos/Talkhouse/p4gf_config ์ฒ๋ผ ๊ฐ ์ ์ฅ์๋ง๋ค ์ค์ ํ ์๋ ์๋๋ฐ ์ ์ญ์ค์ ์์(Override) ์ ์ฉ๋๋ค.
๊ฐ ์ ์ฅ์๋ณ ์ค์ ํ์ผ์ ๋ด์ฉ์ ๋ณด๋ฉด ์๋์ ๊ฐ์ด ์ ์ญ ์ค์ ๊ณผ ๋ค๋ฅธ ์น์
์ด ์๋ค.
[Talkhouse-master]
git-branch-name = master
view = //depot/Talkhouse/main-dev/... ...ํ์ผ ๋ด์ฉ์ ๋ณด๋ฉด Perforce์ Git์ ๋ธ๋์น๊ฐ ๋งคํ ์ ๋ณด๋ฅผ ๋ณผ ์ ์๋ค.
์น์
์ด๋ฆ์ ๊ฒน์น์ง๋ง ์์ผ๋ฉด ์๋ฌด๊ฑฐ๋ ์ฌ์ฉํ ์ ์๋ค.
git-branch-name ํญ๋ชฉ์ ๊ธธ๊ณ ์
๋ ฅํ๊ธฐ ์ด๋ ค์ด Depot ๊ฒฝ๋ก๋ฅผ Git์์ ์ฌ์ฉํ๊ธฐ์ ํธํ ์ด๋ฆ์ผ๋ก ์ฐ๊ฒฐํด์ค๋ค.
view ํญ๋ชฉ์ ์ด๋ป๊ฒ Perforce ํ์ผ์ด Git ์ ์ฅ์์ ๋งคํ๋๋์ง๋ฅผ View ๋งคํ ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ ์ค์ ํ๋ค.
์ฌ๋ฌ ํญ๋ชฉ์ ์ค์ ํ ์ ์๋ค.
[multi-project-mapping]
git-branch-name = master
view = //depot/project1/main/... project1/...
//depot/project2/mainline/... project2/...์ด์ ๊ฐ์ ์์ผ๋ก ๊ตฌ์ฑํ๋ฉด ๋๋ ํ ๋ฆฌ ์์ ๋ณ๊ฒฝ์ฌํญ์ด Git ์ ์ฅ์๋ก ๋ฐ์๋๋ค.
๋ง์ง๋ง์ผ๋ก ์ดํด๋ณผ ์ค์ ํ์ผ์ users/p4gf_usermap ํ์ผ๋ก Perforce ์ฌ์ฉ์๋ฅผ Git ์ฌ์ฉ์๋ก ๋งคํํ๋ ์ญํ ์ ํ๋๋ฐ ๋์ ๋ฐ๋ผ์๋ ํ์ํ์ง ์์ ์๋ ์๋ค.
Perforce Changeset์ Git์ ์ปค๋ฐ์ผ๋ก ๋ณํํ ๋ Git Fusion์ Perforce ์ฌ์ฉ์์ ์ด๋ฆ๊ณผ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ Git ์ปค๋ฐ์ ์ ์์ ์ปค๋ฏธํฐ ์ ๋ณด๋ฅผ ์
๋ ฅํ๋ค.
๋ฐ๋๋ก Git ์ปค๋ฐ์ Perforce Changeset์ผ๋ก ๋ณํํ ๋๋ Git ์ปค๋ฐ์ ์ ์ฅ๋ ์ด๋ฆ๊ณผ ์ด๋ฉ์ผ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ Changeset์ ๊ธฐ๋กํ๊ณ ์ด ์ ๋ณด๋ก ๊ถํ์ ํ์ธํ๋ค.
๋ณดํต์ ๋ฆฌ๋ชจํธ ์ ์ฅ์์ ๋์ผํ ์ ๋ณด๊ฐ ๋ฑ๋ก ๋ผ์์ด์ ๋ฌธ์ ์๊ฒ ์ง๋ง ์ ๋ณด๊ฐ ๋ค๋ฅด๋ค๋ฉด ์๋์ ๊ฐ์ด ๋งคํ ์ ๋ณด๋ฅผ ์ค์ ํด์ผ ํ๋ค.
john john@example.com "John Doe"
john johnny@appleseed.net "John Doe"
bob employeeX@example.com "Anon X. Mouse"
joe employeeY@example.com "Anon Y. Mouse"๋งคํ ์ค์ ์ ํ ๋ผ์ธ์ ํ ์ ์ ์ฉ ์ค์ ํ๋ฉฐ ID ์ด๋ฉ์ผ "<๊ธด ์ด๋ฆ>" ํ์์ผ๋ก ๊ตฌ์ฑํ๋ค.
์ฒซ ๋ฒ์งธ ๋ผ์ธ๊ณผ ๋ ๋ฒ์งธ ๋ผ์ธ์ ์ด๋ฉ์ผ ์ฃผ์ ๋ ๊ฐ๋ฅผ Perforce ์ ์ ํ๋๋ก ๋งคํํ๋ค.
์ด๋ ๊ฒ ์ค์ ํ๋ฉด Git ์ปค๋ฐ์ ์ด๋ฉ์ผ ์ฃผ์๋ฅผ ์ฌ๋ฌ ๊ฐ ์ฌ์ฉํ์ด๋ ํ Perforce ์ ์ ์ Changeset์ผ๋ก ๋ณํํ ์ ์๋ค.
๋ฐ๋๋ก Perforce Chageset์ Git ์ปค๋ฐ์ผ๋ก ๋ณ๊ฒฝํ ๋๋ ์ฒซ ๋ฒ์งธ ์ ๋ณด๋ฅผ ์ด์ฉํ์ฌ ์ปค๋ฐ์ ์ ์ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ค.
๋ง์ง๋ง ๋ ๋ผ์ธ์ Perforce ์ฌ์ฉ์ bob๋ joe๋ Git ์ปค๋ฐ์ผ๋ก ๋ณํํ ๋๋ ๊ฐ์ ์ด๋ฆ์ ์ฐ๋๋ก ์ค์ ํ ๊ฒ์ด๋ค. ์ด๋ ๋ด๋ถ ํ๋ก์ ํธ๋ฅผ ์คํ ์์ค๋ก ๊ณต๊ฐํ ๋, ๋ด๋ถ ๊ฐ๋ฐ์ ์ด๋ฆ์ ๋๋ฌ๋ด์ง ์๊ณ ์ธ๋ถ๋ก ์คํํ ๋ ์ ์ฉํ๋ค. Git ์ปค๋ฐ์ ํ ์ฌ๋์ด ์์ฑํ ๊ฒ์ผ๋ก ํ๋ ค๋๊ฒ ์๋๋ผ๋ฉด ์ฌ๋ ์ด๋ฆ๊ณผ ์ด๋ฉ์ผ ์ฃผ์๋ ์ค๋ณต๋์ง ์์์ผ ํ๋ค.
Perforce์ Git Fusion์ Git๊ณผ Perforce์ฌ์ด์์ ์๋ฐฉํฅ์ ๋ฐ์ดํฐ ๋ณํ์ ์ง์ํ๋ Bridge์ด๋ค. Git์ Perforce์ ํด๋ผ์ด์ธํธ๋ก ์ฌ์ฉํ ๋ ์ด๋ค์์ผ๋ก ์ฌ์ฉํ๋ฉด ๋๋์ง ์์ ๋ฅผ ํตํด ์ดํด๋ณด์. ์์์ ์ดํด๋ณธ ์ค์ ํ์ผ๋ก โJamโ ์ด๋ผ๋ Perforce ํ๋ก์ ํธ๋ฅผ ์๋์ ๊ฐ์ด Clone ํ ์ ์๋ค.
$ git clone https://10.0.1.254/Jam
Cloning into 'Jam'...
Username for 'https://10.0.1.254': john
Password for 'https://john@10.0.1.254':
remote: Counting objects: 2070, done.
remote: Compressing objects: 100% (1704/1704), done.
Receiving objects: 100% (2070/2070), 1.21 MiB | 0 bytes/s, done.
remote: Total 2070 (delta 1242), reused 0 (delta 0)
Resolving deltas: 100% (1242/1242), done.
Checking connectivity... done.
$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/rel2.1
$ git log --oneline --decorate --graph --all
* 0a38c33 (origin/rel2.1) Create Jam 2.1 release branch.
| * d254865 (HEAD, origin/master, origin/HEAD, master) Upgrade to latest metrowerks on Beos -- the Intel one.
| * bd2f54a Put in fix for jam's NT handle leak.
| * c0f29e7 Fix URL in a jam doc
| * cc644ac Radstone's lynx port.
[...]๋จผ์ ์ฒ์ ์ ์ฅ์๋ฅผ Clone ํ ๋๋ ์๊ฐ์ด ๋งค์ฐ ๋ง์ด ๊ฑธ๋ฆด ์ ์๋ค. Git Fusion์ด Perforce ์ ์ฅ์์์ ๊ฐ์ ธ์จ ๋ชจ๋ Changeset์ Git ์ปค๋ฐ์ผ๋ก ๋ณํํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋ณํํ๋ ๊ณผ์ ์ด์ผ ๋น ๋ฅด๋๋ผ๋ ํ์คํ ๋ฆฌ ์์ฒด ํฌ๊ธฐ๊ฐ ํฌ๋ค๋ฉด ์ ์ฒด Clone ํ๋ ์๊ฐ์ ์ค๋ ๊ฑธ๋ฆฌ๊ธฐ ๋ง๋ จ์ด๋ค. ์ด๋ ๊ฒ ํ ๋ฒ ์ ์ฒด๋ฅผ Clone ํ ํ์ ์ถ๊ฐ๋ ๋ด์ฉ๋ง์ ๋ฐ์์ค๋ ์๊ฐ์ Git๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ค๋๊ฑธ๋ฆฌ์ง ์๋๋ค.
Clone ํ ์ ์ฅ์๋ ์ง๊ธ๊น์ง ์ดํด๋ณธ ์ผ๋ฐ์ ์ธ Git ์ ์ฅ์์ ๋๊ฐ๋ค.
ํ์ธํด๋ณด๋ฉด ๋ธ๋์น๊ฐ 3๊ฐ ์๋ค. ๋จผ์ Git์ ๋ก์ปฌ master ๋ธ๋์น๊ฐ ์๋ฒ์ origin/master ๋ธ๋์น๋ฅผ ์ถ์ ํ๋๋ก ๋ฏธ๋ฆฌ ๋ง๋ค์ด ๋๋ค.
๋ดํค๋๋๋ก ํ์ผ์ ์ข ์์ ํ๊ณ ์ปค๋ฐ์ ๋์ด๋ฒ ํ๋ฉด ์๋์ ๊ฐ์ด ํ์คํ ๋ฆฌ๊ฐ ์์ธ ๋ชจ์ต์ ๋ณผ ์ ์๋ค.
# ...
$ git log --oneline --decorate --graph --all
* cfd46ab (HEAD, master) Add documentation for new feature
* a730d77 Whitespace
* d254865 (origin/master, origin/HEAD) Upgrade to latest metrowerks on Beos -- the Intel one.
* bd2f54a Put in fix for jam's NT handle leak.
[...]์ ์ปค๋ฐ ๋ ๊ฐ๊ฐ ๋ก์ปฌ ํ์คํ ๋ฆฌ์ ์์๋ค. ๋ค๋ฅธ ์ฌ๋์ด Push ํ ์ผ์ด ์๋์ง ํ์ธํด๋ณด์.
$ git fetch
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 3 (delta 2), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://10.0.1.254/Jam
d254865..6afeb15 master -> origin/master
$ git log --oneline --decorate --graph --all
* 6afeb15 (origin/master, origin/HEAD) Update copyright
| * cfd46ab (HEAD, master) Add documentation for new feature
| * a730d77 Whitespace
|/
* d254865 Upgrade to latest metrowerks on Beos -- the Intel one.
* bd2f54a Put in fix for jam's NT handle leak.
[...]๊ทธ์ ๋๊ตฐ๊ฐ ๋ถ์ง๋ฐํ ์ผ์ ํ๋๋ณด๋ค.
์ ํํ ๋๊ฐ ์ด๋ค ์ผ์ ํ๋์ง๋ ์ปค๋ฐ์ ๊น๋ด์ผ ์๊ฒ ์ง๋ง ์ด์จ๋ Git Fusion์ ์๋ฒ๋ก๋ถํฐ ์๋ก ๊ฐ์ ธ์จ Changeset์ ๋ณํํด์ 6afeb15 ์ปค๋ฐ์ ๋ง๋ค์ด๋จ๋ค.
์ฌํ Git์์ ๋ณธ ์ฌํ ์ปค๋ฐ์ด๋ ๋ค๋ฅด์ง ์๋ค.
์ด์ Perforce ์๋ฒ๊ฐ Merge ์ปค๋ฐ์ ์ด๋ป๊ฒ ๋ค๋ฃจ๋์ง ์ดํด๋ณด์.
$ git merge origin/master
Auto-merging README
Merge made by the 'recursive' strategy.
README | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
$ git push
Counting objects: 9, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (9/9), done.
Writing objects: 100% (9/9), 917 bytes | 0 bytes/s, done.
Total 9 (delta 6), reused 0 (delta 0)
remote: Perforce: 100% (3/3) Loading commit tree into memory...
remote: Perforce: 100% (5/5) Finding child commits...
remote: Perforce: Running git fast-export...
remote: Perforce: 100% (3/3) Checking commits...
remote: Processing will continue even if connection is closed.
remote: Perforce: 100% (3/3) Copying changelists...
remote: Perforce: Submitting new Git commit objects to Perforce: 4
To https://10.0.1.254/Jam
6afeb15..89cba2b master -> masterGit์ ์ด๋ ๊ฒ Merge ํ๊ณ Push ํ๋ฉด ์ ๋์๊ฒ ๊ฑฐ๋ ํ๋ค.
Perforce์ ๊ด์ ์์ README ํ์ผ์ ํ์คํ ๋ฆฌ๋ฅผ ์๊ฐํด๋ณด์. Perforce ํ์คํ ๋ฆฌ๋ p4v ๊ทธ๋ํ ๊ธฐ๋ฅ์ผ๋ก ๋ณผ ์ ์๋ค.
Perforce์ ์ด๋ฐ ํ์คํ ๋ฆฌ ๋ทฐ์ด๋ฅผ ๋ณธ ์ ์ด ์๋ค๋ฉด ๋ค์ ํผ๋์ค๋ฝ๊ฒ ์ง๋ง Git ํ์คํ ๋ฆฌ๋ฅผ ๋ณด๋ ๊ฒ๊ณผ ํฌ๊ฒ ๋ค๋ฅด์ง ์๋ค.
๊ทธ๋ฆผ์ README ํ์ผ์ ํ์คํ ๋ฆฌ๋ฅผ ๋ณด๋ ์ํฉ์ด๋ค. ์ผ์ชฝ ์ ์ฐฝ์์ README ํ์ผ๊ณผ ๊ด๋ จ๋ ๋ธ๋์น์ ๋๋ ํ ๋ฆฌ๊ฐ ๋ํ๋๋ค.
์ค๋ฅธ์ชฝ ์ ์ฐฝ์์๋ ํ์ผ์ ๋ฆฌ๋น์ ํ์คํ ๋ฆฌ ๊ทธ๋ํ๋ฅผ ๋ณผ ์ ์๋ค. ์ค๋ฅธ์ชฝ ์๋ ์ฐฝ์์๋ ์ด ๊ทธ๋ํ์ ํฐ ๊ทธ๋ฆผ์ ํ์ธํ ์ ์๋ค.
์ผ์ชฝ ์๋ ์ฐฝ์๋ ์ ํํ ๋ฆฌ๋น์ ์ ์์ธํ ๋ณด์ฌ์ค๋ค(์ด ๊ทธ๋ฆผ์์๋ ๋ฆฌ๋น์ 2 ๋ค)
Perforce์ ํ์คํ ๋ฆฌ ๊ทธ๋ํ์์ผ๋ก๋ Git์ ํ์คํ ๋ฆฌ์ ๋ ๊ฐ์ ๋ณด์ธ๋ค.
ํ์ง๋ง, Perforce๋ 1 ๊ณผ 2 ์ปค๋ฐ์ ์ ์ฅํ ๋งํ ๋ธ๋์น๊ฐ ์๋ค. ๊ทธ๋์ .git-fusion ๋๋ ํ ๋ฆฌ ์์ โ์ต๋ช
โ ๋ธ๋์น๋ฅผ ๋ง๋ ๋ค.
Git ๋ธ๋์น๊ฐ Perforce์ ๋ธ๋์น์ ๋งค์น๋์ง ์์ ๊ฒฝ์ฐ์๋ ์ด์ ๊ฐ์ ๋ชจ์์ด ๋๋ค(๋ธ๋์น๊ฐ ๋งคํ์ ๋์ค์ ์ค์ ํ ์๋ ์๋ค).
์ด๋ฐ ์์ ๋ค์ Git Fusion ๋ด๋ถ์์ ๋ณด์ด์ง ์๊ฒ ์ฒ๋ฆฌ๋๋ค. ๋ฌผ๋ก ์ด ๊ฒฐ๊ณผ๋ก Git ํด๋ผ์ด์ธํธ๋ก Perforce ์๋ฒ์ ์ ๊ทผํ๋ ์ฌ๋์ด ์๋ค๋ ๊ฒ์ ๋๊ตฐ๊ฐ๋ ์๊ฒ ๋๋ค.
Perforce ์๋ฒ์ ๊ถํ์ด ์๋ค๋ฉด Git Fusion์ Git๊ณผ Perforce ์๋ฒ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๋๊ตฌ๋ก ๋งค์ฐ ์ ์ฉํ๋ค. ๋ฌผ๋ก ์ข ์ค์ ํด์ผ ํ๋ ๋ถ๋ถ๋ ์์ง๋ง ์ตํ๋๊ฒ ๊ทธ๋ฆฌ ์ด๋ ต์ง๋ ์๋ค. ์ด ์ ์์๋ Git์ ์กฐ์ฌํด์ ์ฌ์ฉํ๋ผ๊ณ ๋งํ์ง ์๋๋ค. ์ด ์ ์ ๊ทธ๋ฐ ์ ์ด๋ค. ๊ทธ๋ ๋ค๊ณ Perforce ์๋ฒ๊ฐ ์๋ฌด๊ฑฐ๋ ๋ค ๋ฐ์ ์ฃผ์ง ์๋๋ค. ์ด๋ฏธ Push ํ ํ์คํ ๋ฆฌ๋ฅผ ์ฌ์์ฑํ๊ณ Push ํ๋ฉด Git Fusion์ด ๊ฑฐ์ ํ๋ค. ์ด๋ฐ ๊ฒฝ์ฐ์๋ Git Fusion์ ์ด์ฌํ ๋ ธ๋ ฅํด์ Perforce๋ฅผ ๋ง์น Git ์ฒ๋ผ ๋ค๋ฃฐ ์ ์๊ฒ ๋์์ค๋ค. (Perforce ์ฌ์ฉ์์๊ฒ๋ ์์ํ๊ฒ ์ง๋ง) Git ์๋ธ๋ชจ๋๋ ์ฌ์ฉํ ์ ์๊ณ ๋ธ๋์น(Perforce ์ชฝ์๋ Integration์ผ๋ก ๊ธฐ๋ก๋๋ค)๋ฅผ Merge ํ ์๋ ์๋ค.
์๋ฒ ๊ด๋ฆฌ ๊ถํ์ด ์์ผ๋ฉด Git Fusion์ ์ธ ์ ์์ง๋ง ์์ง ๋ค๋ฅธ ๋ฐฉ๋ฒ์ด ๋จ์ ์๋ค.
Git-p4๋ Git๊ณผ Perforce๊ฐ์ ์๋ฐฉํฅ Bridge์ด๋ค. Git-p4๋ ๋ชจ๋ ์์ ์ด ํด๋ผ์ด์ธํธ์ธ Git ์ ์ฅ์ ์ชฝ์์ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ Perforce ์๋ฒ์ ๋ํ ๊ถํ์ด ์์ด๋ ๋๋ค. ๋ฌผ๋ก , ์ธ์ฆ ์ ๋ณด ์ ๋๋ Perforce ์๋ฒ๊ฐ ํ์ํ๋ค. Git-p4๋ Git Fusion๋งํผ ์์ฑ๋ ๋๊ณ ์ ์ฐํ์ง ์์ง๋ง Perforce ์๋ฒ๋ฅผ ๊ฑด๋๋ฆฌ์ง ์๊ณ ์๋ ๋๋ถ๋ถ์ ๋ค ํ ์ ์๊ฒ ํด์ค๋ค.
|
Note
|
git-p4๊ฐ ์ ๋์ํ๋ ค๋ฉด |
์์ ๋ก ์ฌ์ฉํ Perforce ํ๋ก์ ํธ๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด ์์์ ์ดํด๋ณธ Git Fusion OVA ์ด๋ฏธ์ง์ Perforce ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ค. Git Fusion ์๋ฒ ์ค์ ์ ๊ฑด๋๋ฐ๊ณ Perforce ์๋ฒ์ ์ ์ฅ์ ์ค์ ๋ถ๋ถ๋ง ์ค์ ํ๋ฉด ๋๋ค.
git-p4์ด ์์กดํ๋ p4 ํด๋ผ์ด์ธํธ๋ฅผ ์ปค๋งจ๋๋ผ์ธ์์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ช ๊ฐ์ง ํ๊ฒฝ๋ณ์๋ฅผ ๋จผ์ ์ค์ ํด์ผ ํ๋ค.
$ export P4PORT=10.0.1.254:1666
$ export P4USER=johnGit์์ ๋ชจ๋ ์์์ Clone ์ด๋ค. Clone์ ๋จผ์ ํ๋ค.
$ git p4 clone //depot/www/live www-shallow
Importing from //depot/www/live into www-shallow
Initialized empty Git repository in /private/tmp/www-shallow/.git/
Doing initial import of //depot/www/live/ from revision #head into refs/remotes/p4/masterGit์ ์ธ์ด๋ก ํํํ์๋ฉด ์์ ๋ช ๋ น์ โshallowโ Clone์ ํ๋ค. ๋ชจ๋ ์ ์ฅ์์ ํ์คํ ๋ฆฌ๋ฅผ ๊ฐ์ ธ์ค์ง ์๊ณ ๋ง์ง๋ง ๋ฆฌ๋น์ ์ ํ์คํ ๋ฆฌ๋ง ๊ฐ์ ธ์จ๋ค. ์ด ์ ์ ๊ธฐ์ตํด์ผ ํ๋ค. Perforce๋ ์ ์ฅ์์ ๋ชจ๋ ํ์คํ ๋ฆฌ๋ฅผ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ํ์ฉํ์ง ์๋๋ก ์ค๊ณ๋๋ค. ๋ง์ง๋ง ๋ฆฌ๋น์ ๋ง์ ๊ฐ์ ธ์๋ Git์ ์ถฉ๋ถํ Perforce ํด๋ผ์ด์ธํธ๋ก ์ฌ์ฉํ ์ ์๋ค. ๋ฌผ๋ก ์ ์ฒด ํ์คํ ๋ฆฌ๋ฅผ ๋ด์ผํ๋ ์๋๋ผ๋ฉด ์ถฉ๋ถํ์ง ์๋ค.
์ด๋ ๊ฒ Clone ํ๊ณ ๋๋ฉด Git ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์๋ Git ์ ์ฅ์ ํ๋๊ฐ ๋ง๋ค์ด์ง๋ค.
$ cd myproject
$ git log --oneline --all --graph --decorate
* 70eaf78 (HEAD, p4/master, p4/HEAD, master) Initial import of //depot/www/live/ from the state at revision #head(์ญ์ฃผ - ์ฝ๋ ํ๋ฆฐ๋ฏ)
Perforce ์๋ฒ๋ฅผ ๊ฐ๋ฆฌํค๋ โp4โ ๋ฆฌ๋ชจํธ๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ๋ชจ๋ฅด์ง๋ง Clone์ ์๋๋ค. ์ฌ์ค ๋ฆฌ๋ชจํธ๋ ์ค์ ํ์ง ์๋๋ค.
$ git remote -vํ์ธํด๋ณด๋ฉด ๋ฆฌ๋ชจํธ๊ฐ ์ ํ ์๋ค.
git-p4๋ ๋ฆฌ๋ชจํธ ์๋ฒ์ ์ํ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ๋ช ๊ฐ์ง Ref๋ฅผ ๋ง๋ ๋ค. ์ด Ref๋ git log ์์๋ ๋ฆฌ๋ชจํธ์ธ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฌ์ค Git์ด ๊ด๋ฆฌํ๋ ๋ฆฌ๋ชจํธ๊ฐ ์๋๋ผ์ Push ํ ์ ์๋ค.
์ค๋น๋ฅผ ๋ง์ณค์ผ๋ ๋ ์์ ํ๊ณ ์ปค๋ฐํ๊ณ Push ํด๋ณด์. ์ด๋ค ์ค์ํ ์์ ์ ๋ง์น๊ณ ํ ๋๋ฃ๋ค์๊ฒ ๊ณต์ ํ๋ ค๋ ์ํฉ์ ์ดํด๋ณด์.
$ git log --oneline --all --graph --decorate
* 018467c (HEAD, master) Change page title
* c0fb617 Update link
* 70eaf78 (p4/master, p4/HEAD) Initial import of //depot/www/live/ from the state at revision #head์ปค๋ฐ์ ๋ ๊ฐ ์์ฑํ๊ณ Perforce ์๋ฒ๋ก ์ ์กํ ์ค๋น๊ฐ ๋๋ค. Push ํ๊ธฐ ์ ์ ๋ค๋ฅธ ๋๋ฃ๊ฐ ์์ ํ ์ฌํญ์ด ์๋์ง ํ์ธํ๋ค.
$ git p4 sync
git p4 sync
Performing incremental import into refs/remotes/p4/master git branch
Depot paths: //depot/www/live/
Import destination: refs/remotes/p4/master
Importing revision 12142 (100%)
$ git log --oneline --all --graph --decorate
* 75cd059 (p4/master, p4/HEAD) Update copyright
| * 018467c (HEAD, master) Change page title
| * c0fb617 Update link
|/
* 70eaf78 Initial import of //depot/www/live/ from the state at revision #headํ ๋๋ฃ๊ฐ ์์ ํ ๋ด์ฉ์ด ์ถ๊ฐ๋์ด master ๋ธ๋์น์ p4/master ๋ธ๋์น๊ฐ ๊ฐ๋ผ์ง๊ฒ ๋์๋ค.
Perforce์ ๋ธ๋์น ๊ด๋ฆฌ ๋ฐฉ์์ Git๊ณผ ๋ฌ๋ผ์ Merge ์ปค๋ฐ์ ์๋ฒ๋ก ์ ์กํ๋ฉด ์๋๋ค.
๋์ git-p4๋ ์๋์ ๊ฐ์ ๋ช
๋ น์ผ๋ก ์ปค๋ฐ์ Rebase ํ๊ธฐ๋ฅผ ๊ถ์ฅํ๋ค.
$ git p4 rebase
Performing incremental import into refs/remotes/p4/master git branch
Depot paths: //depot/www/live/
No changes to import!
Rebasing the current branch onto remotes/p4/master
First, rewinding head to replay your work on top of it...
Applying: Update link
Applying: Change page title
index.html | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋จ์ํ git p4 rebase ๋ git rebase p4/master ํ๊ณ git p4 sync ๋ช
๋ น์ ์คํํ ๊ฒ ์ฒ๋ผ ๋ณด์ผ ์ ์๋ค.
๋ธ๋์น๊ฐ ์ฌ๋ฌ๊ฐ์ธ ์ํฉ์์ ํจ์ฌ ํจ๊ณผ๋ฅผ ๋ณด์ด์ง๋ง ์ด๋ ๊ฒ ์๊ฐํด๋ ๊ด์ฐฎ๋ค.
์ด์ ์ปค๋ฐ ํ์คํ ๋ฆฌ๊ฐ ์ผ์ง์ ์ด ๋๊ณ Perforce ์๋ฒ๋ก ๊ณต์ ํ ์ค๋น๋ฅผ ๋ง์ณค๋ค.
git p4 submit ๋ช
๋ น์ p4/master ์ master ์ฌ์ด์ ์๋ ๋ชจ๋ ์ปค๋ฐ์ ๋ํด ์ Perforce ๋ฆฌ๋น์ ์ ์์ฑํ๋ค.
๋ช
๋ น์ ์คํํ๋ฉด ์ฃผ๋ก ์ฐ๋ ํธ์ง๊ธฐ๊ฐ ๋จ๊ณ ์๋์ ๊ฐ์ ๋ด์ฉ์ผ๋ก ์ฑ์์ง๋ค.
# A Perforce Change Specification.
#
# Change: The change number. 'new' on a new changelist.
# Date: The date this specification was last modified.
# Client: The client on which the changelist was created. Read-only.
# User: The user who created the changelist.
# Status: Either 'pending' or 'submitted'. Read-only.
# Type: Either 'public' or 'restricted'. Default is 'public'.
# Description: Comments about the changelist. Required.
# Jobs: What opened jobs are to be closed by this changelist.
# You may delete jobs from this list. (New changelists only.)
# Files: What opened files from the default changelist are to be added
# to this changelist. You may delete files from this list.
# (New changelists only.)
Change: new
Client: john_bens-mbp_8487
User: john
Status: new
Description:
Update link
Files:
//depot/www/live/index.html # edit
######## git author ben@straub.cc does not match your p4 account.
######## Use option --preserve-user to modify authorship.
######## Variable git-p4.skipUserNameCheck hides this message.
######## everything below this line is just the diff #######
--- //depot/www/live/index.html 2014-08-31 18:26:05.000000000 0000
+++ /Users/ben/john_bens-mbp_8487/john_bens-mbp_8487/depot/www/live/index.html 2014-08-31 18:26:05.000000000 0000
@@ -60,7 +60,7 @@
</td>
<td valign=top>
Source and documentation for
-<a href="http://www.perforce.com/jam/jam.html">
+<a href="jam.html">
Jam/MR</a>,
a software build tool.
</td>์ด ๋ด์ฉ์ p4 submit ์ ์คํํ์ ๋ ๋ณด์ด๋ ๋ด์ฉ๊ณผ ๊ฐ๋ค. ๋ค๋ง git-p4๋ ์๋์ชฝ์ ๋์์ด ๋ ๋งํ ๋ด์ฉ์ ๋ง ๋ถ์ฌ ์ค๋ค.
git-p4๋ ์ปค๋ฐ์ด๋ Changeset์ ์์ฑํ ๋ ์ต๋ํ Git๊ณผ Perforce์ ์๋ ์ ๋ณด๋ฅผ ์ด์ฉํ๋ค. ํ์ง๋ง ๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ณํํ ๋ ์ง์ ์
๋ ฅํด์ค์ผ ํ ์๋ ์๋ค.
๋ณด๋ด๋ ค๊ณ ํ๋ ์ปค๋ฐ์ ์ ์๊ฐ Perforce์ ๊ณ์ ์ด ์์ ๋๋ ๊ทธ ์ ์๊ฐ ์์ฑํ Changeset์ผ๋ก ๊ธฐ๋ก๋๊ธธ ๋ฐ๋ ๊ฒ์ด๋ค.
git-p4๊ฐ Git ์ปค๋ฐ์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก Perforce Changeset์ ๋ฉ์์ง๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ๋ณดํต ๊ทธ๋ฅ ๋ด์ฉ์ ์ ์ฅํ๊ณ ํธ์ง๊ธฐ๋ฅผ ์ข
๋ฃํ๋ฉด ๋๋ค. ์ปค๋ฐ์ด ๋ ๊ฐ ์์ผ๋ฏ๋ก ์ ์ฅํ๊ณ ์ข
๋ฃํ๊ธฐ๋ฅผ ๋ ๋ฒ ํ๋ค.
์ด์จ๋ ๊ฐ์ git p4 submit ์ ์คํํ ๊ฒฐ๊ณผ๋ ์๋์ ๊ฐ๋ค.
$ git p4 submit
Perforce checkout for depot path //depot/www/live/ located at /Users/ben/john_bens-mbp_8487/john_bens-mbp_8487/depot/www/live/
Synchronizing p4 checkout...
... - file(s) up-to-date.
Applying dbac45b Update link
//depot/www/live/index.html#4 - opened for edit
Change 12143 created with 1 open file(s).
Submitting change 12143.
Locking 1 files ...
edit //depot/www/live/index.html#5
Change 12143 submitted.
Applying 905ec6a Change page title
//depot/www/live/index.html#5 - opened for edit
Change 12144 created with 1 open file(s).
Submitting change 12144.
Locking 1 files ...
edit //depot/www/live/index.html#6
Change 12144 submitted.
All commits applied!
Performing incremental import into refs/remotes/p4/master git branch
Depot paths: //depot/www/live/
Import destination: refs/remotes/p4/master
Importing revision 12144 (100%)
Rebasing the current branch onto remotes/p4/master
First, rewinding head to replay your work on top of it...
$ git log --oneline --all --graph --decorate
* 775a46f (HEAD, p4/master, p4/HEAD, master) Change page title
* 05f1ade Update link
* 75cd059 Update copyright
* 70eaf78 Initial import of //depot/www/live/ from the state at revision #headgit p4 submit ์ ๊ฐ๊น์ด Git์ ๋ช
๋ น์ push ์ด๋ฉฐ ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด git push ๋ช
๋ น์ ์คํํ ๊ฒ๊ณผ ๋น์ทํ๋ค.
Git ์ปค๋ฐ์ด Perforce์ Changeset์ผ๋ก ๋ณํ๋๋ ๊ณผ์ ์ ์์ธํ ์ดํด๋ณด์. Git ์ปค๋ฐ ์ฌ๋ฌ๊ฐ๋ฅผ ํ๋์ Perforce Changeset์ผ๋ก ๋ง๋ค๋ ค๋ฉด git p4 submit ๋ช
๋ น์ ์คํํ๊ธฐ ์ ์ Rebase๋ก ์ปค๋ฐ์ ํ๋๋ก ํฉ์น๋ฉด ๋๋ค.
์๋ฒ๋ก ๋ณด๋ธ ์ปค๋ฐ์ SHA-1 ํด์๋ฅผ ๋ณด๋ฉด ๊ทธ ๊ฐ์ด ๋ฐ๋๋ค. git-p4์ด Changeset์ผ๋ก ๋ณํํ ๋ ๊ฐ ์ปค๋ฐ ๋ฉ์์ง์ ๋ง์ง๋ง์ ์๋์ ๊ฐ์ด ํ ๋ผ์ธ์ ์ถ๊ฐํด์ ๋ฌ๋ผ์ง๋ค.
$ git log -1
commit 775a46f630d8b46535fc9983cf3ebe6b9aa53145
Author: John Doe <john@example.com>
Date: Sun Aug 31 10:31:44 2014 -0800
Change page title
[git-p4: depot-paths = "//depot/www/live/": change = 12144]Merge ์ปค๋ฐ์ ์๋ฒ๋ก ์ ์กํ๋ฉด ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ์ดํด๋ณด์. ์๋์ ๊ฐ์ ์ปค๋ฐ ํ์คํ ๋ฆฌ๊ฐ ํ์ฌ ์ฒํ ์ํฉ์ด๋ผ๊ณ ์๊ฐํด๋ณด์.
$ git log --oneline --all --graph --decorate
* 3be6fd8 (HEAD, master) Correct email address
* 1dcbf21 Merge remote-tracking branch 'p4/master'
|\
| * c4689fc (p4/master, p4/HEAD) Grammar fix
* | cbacd0a Table borders: yes please
* | b4959b6 Trademark
|/
* 775a46f Change page title
* 05f1ade Update link
* 75cd059 Update copyright
* 70eaf78 Initial import of //depot/www/live/ from the state at revision #head775a46f ์ปค๋ฐ ์ดํ์ Git๊ณผ Perforce ํ์คํ ๋ฆฌ๊ฐ ๊ฐ๋ผ์ก๋ค. Git์ผ๋ก ์์ ํ ์ชฝ์๋ ์ปค๋ฐ์ด ๋ ๊ฐ, Perforce ์ชฝ์๋ ์ปค๋ฐ ํ๋๊ฐ ์ถ๊ฐ๋๊ณ Merge ํ๊ณ ์๋ ์ปค๋ฐ์ด ์ถ๊ฐ๋๋ค. ์ฌ๊ธฐ์ ์๋ฒ๋ก ๋ณด๋ด๋ฉด Perforce ์ชฝ Changeset ์์ ์์ธ๋ค. ๋ฐ๋ก Perforce ์๋ฒ๋ก ํ์คํ ๋ฆฌ๋ฅผ ๋ณด๋ด ๋ณด์.
$ git p4 submit -n
Perforce checkout for depot path //depot/www/live/ located at /Users/ben/john_bens-mbp_8487/john_bens-mbp_8487/depot/www/live/
Would synchronize p4 checkout in /Users/ben/john_bens-mbp_8487/john_bens-mbp_8487/depot/www/live/
Would apply
b4959b6 Trademark
cbacd0a Table borders: yes please
3be6fd8 Correct email address-n ์ต์
์ --dry-run ์ ๋จ์ถ ์ต์
์ผ๋ก ๋ช
๋ น์ผ ์ค์ ๋ก ์คํํ๊ธฐ ์ ์ ์ด๋ป๊ฒ ๋์ํ๋ ์ง ๋ฏธ๋ฆฌ ํ์ธํด ๋ณผ ์ ์๋ค.
๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋ก์ปฌ์๋ง ์๋ ์ปค๋ฐ 3๊ฐ๊ฐ Perforce Changeset์ผ๋ก ์ ๋ง๋ค์ด์ง๋ ๊ฒ์ผ๋ก ๋ณด์ธ๋ค.
ํ์คํ ์ด ๊ฒฐ๊ณผ๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ฐ์ด๋ค. ์ค์ ๋ก ์คํํ์.
$ git p4 submit
[โฆ]
$ git log --oneline --all --graph --decorate
* dadbd89 (HEAD, p4/master, p4/HEAD, master) Correct email address
* 1b79a80 Table borders: yes please
* 0097235 Trademark
* c4689fc Grammar fix
* 775a46f Change page title
* 05f1ade Update link
* 75cd059 Update copyright
* 70eaf78 Initial import of //depot/www/live/ from the state at revision #headRebase ํ๊ณ ๋์ ์ ์กํ ๊ฒ์ฒ๋ผ ํ์คํ ๋ฆฌ๊ฐ ์ผ์ง์ ์ด ๋๋ค. ์ด ๊ฒฐ๊ณผ๋ Git์ผ๋ก ์์ ๋กญ๊ฒ ๋ธ๋์น๋ฅผ ๋ง๋ค๊ณ ๋ฒ๋ฆฌ๊ณ Merge ํด๋ ๋๋ค๋ ๊ฒ์ ๋งํด์ค๋ค. ํ์คํ ๋ฆฌ๊ฐ Perforce์ ๋ง์ง ์๋๋ผ๋ ๊ฑฑ์ ํ ํ์ ์๋ค. ๋ฌผ๋ก ์ง์ Rebase ํด์ Perforce ์๋ฒ๋ก ์ ์กํด๋ ๋๋ค.
Perforce ํ๋ก์ ํธ์ ๋ธ๋์น๊ฐ ๋ง์๋ ๊ด์ฐฎ๋ค. git-p4์ Perforce ๋ธ๋์น๋ฅผ Git ๋ธ๋์น๋ก ์๊ฐํ๊ฒ ๋ ๋ง๋ค์ด ์ค๋ค. Perforce Depot์ด ์๋์ ๊ฐ๋ค๊ณ ํ์.
//depot
โโโ project
โโโ main
โโโ devdev ๋ธ๋์น๊ฐ ์๋์ ๊ฐ์ View Spec์ ๊ฐ๊ณ ์๋ค๋ฉด,
//depot/project/main/... //depot/project/dev/...์๋์ ๊ฐ์ด git-p4๋ ์๋์ผ๋ก ๋ธ๋์น ์ ๋ณด๋ฅผ ์ฐพ์์ ์ ์ฒ๋ฆฌํ๋ค.
$ git p4 clone --detect-branches //depot/project@all
Importing from //depot/project@all into project
Initialized empty Git repository in /private/tmp/project/.git/
Importing revision 20 (50%)
Importing new branch project/dev
Resuming with change 20
Importing revision 22 (100%)
Updated branches: main dev
$ cd project; git log --oneline --all --graph --decorate
* eae77ae (HEAD, p4/master, p4/HEAD, master) main
| * 10d55fb (p4/project/dev) dev
| * a43cfae Populate //depot/project/main/... //depot/project/dev/....
|/
* 2b83451 Project initDepot ๊ฒฝ๋ก์ โ@allโ ์ด๋ผ๊ณ ์ง์ ํด์ฃผ๋ฉด git-p4๋ ๋ง์ง๋ง Changeset๋ง์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋๋ผ ์ง์ ํ ๊ฒฝ๋ก์ ๋ชจ๋ Changeset์ ๊ฐ์ ธ์จ๋ค. Git์ Clone๊ณผ ๋น์ทํ๋ค. ํ๋ก์ ํธ ํ์คํ ๋ฆฌ๊ฐ ๊ธธ๋ฉด Clone ํ๋๋ฐ ์ค๋ ๊ฑธ๋ฆฐ๋ค.
--detect-branches ์ต์
์ ์ฃผ๋ฉด git-p4๋ Perforce์ ๋ธ๋์น๋ฅผ Git์ ๋ธ๋์น๋ก ๋งคํํด ์ค๋ค.
๋งคํ ์ ๋ณด๋ฅผ Perforce ์๋ฒ์ ๋๋ ๊ฒ์ด Perforce ๋ค์ด ๋ฐฉ์์ด์ง๋ง git-p4์ ์ง์ ์๋ ค์ค ์๋ ์๋ค. ๋ธ๋์น ๋งคํ ์ ๋ณด๋ฅผ git-p4์ ์ ๋ฌํด์ ์์ ๊ฒฐ๊ณผ์ ๋ ๊ฐ์ด ๋งคํ์ํฌ ์ ์๋ค.
$ git init project
Initialized empty Git repository in /tmp/project/.git/
$ cd project
$ git config git-p4.branchList main:dev
$ git clone --detect-branches //depot/project@all .git-p4.branchList ์ค์ ์ main:dev ๊ฐ์ ์ ์ฅํด๋๋ฉด git-p4๋ โmainโ ๊ณผ โdevโ ๊ฐ ๋ธ๋์น ์ด๋ฆ์ด๊ณ ํ์๋ ์ ์์์ ๊ฐ๋ผ์ ธ๋์จ ๊ฒ์ด๋ผ ํ์
ํ๋ค.
์ด์ git checkout -b dev p4/project/dev ํ๊ณ ์ปค๋ฐ์ ์์ผ๋ฉด, git p4 submit ๋ช
๋ น์ ์คํํ ๋ git-p4๊ฐ ๋๋ํ๊ฒ ์์์ ๋ธ๋์น๋ฅผ ์ ์ฐพ์ ์ค๋ค.
์ํ๊น๊ฒ๋ ๋ง์ง๋ง ๋ฆฌ๋น์ ๋ง ๋ฐ์ ์ค๋ Shallow Clone์ ํด์ผ ํ๋ ์ํฉ์์๋ ๋์์ ๋ธ๋์น๋ฅผ ์ฌ๋ฌ๊ฐ ์ธ ์ ์๋ค. ์์ฒญ๋๊ฒ ํฐ Perforce์ด๊ณ ์ฌ๋ฌ ๋ธ๋์น๋ฅผ ์ค๊ฐ๋ฉฐ ์์
ํด์ผ ํ๋ค๋ฉด ๋ธ๋์น ๋ณ๋ก git p4 clone ์ ๋ฐ๋ก ํ๋ ์ ๋ฐ์ ์๋ค.
Perforce์ ๋ธ๋์น๋ฅผ ์์ฑํ๊ฑฐ๋ ๋ธ๋์น๋ผ๋ฆฌ ํฉ์น๋ ค๋ฉด Perforce ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ๋์ ํ์ํ๋ค. git-p4๋ ์ด๋ฏธ ์กด์ฌํ๋ ๋ธ๋์น๋ก๋ถํฐ Changeset์ ๊ฐ์ ธ์ค๊ฑฐ๋ ์ปค๋ฐ์ ๋ณด๋ด๋ ์ผ๋ง ํ ์ ์๋ค. ์ผ์ง์ ํํ์ Changeset ํ์คํ ๋ฆฌ๋ง์ ์ ์งํ ์ ์๋ค. ๋ธ๋์น๋ฅผ Git์์ Merge ํ๊ณ Perforce ์๋ฒ๋ก ๋ณด๋ด๋ฉด ๋จ์ํ ํ์ผ ๋ณํ๋ง ๊ธฐ๋ก๋๋ค. ์ด๋ค ๋ธ๋์น๋ฅผ Merge ํ๋ ์ง์ ๊ฐ์ ๋ฉํฐ๋ฐ์ดํฐ๋ ๊ธฐ๋ก๋์ง ์๋๋ค.
git-p4 Perforce ์๋ฒ๋ฅผ ์ฐ๋ ํ๊ฒฝ์์๋ Git์ผ๋ก ์ผํ ์ ์๊ฒ ํด์ค๋ค. ํ์ง๋ง ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๋ ์ฃผ์ฒด๋ Perforce์ด๊ณ Git์ ๋ก์ปฌ์์๋ง ์ฌ์ฉํ๋ค๋ ์ ์ ๊ธฐ์ตํด์ผ ํ๋ค. ๋ฐ๋ผ์ Git ์ปค๋ฐ์ Perforce ์๋ฒ๋ก ๋ณด๋ด์ ๊ณต์ ํ ๋๋ ํญ์ ์ฃผ์๊น๊ฒ ์์ ํด์ผ ํ๋ค. ํ ๋ฒ Perforce ์๋ฒ๋ก ๋ณด๋ธ ์ปค๋ฐ์ ๋ค์ ๋ณด๋ด์๋ ์๋๋ค.
Perforce์ Git ํด๋ผ์ด์ธํธ๋ฅผ ์ ์ฝ์์ด ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์๋ฒ ๊ด๋ฆฌ ๊ถํ์ด ํ์ํ๋ค. Git Fusion์ Git์ ๋งค์ฐ ์ฐ์ํ Perforce ํด๋ผ์ด์ธํธ๋ก ๋ง๋ค์ด ์ค๋ค.

