Skip to content

Latest commit

ย 

History

History
985 lines (865 loc) ยท 52.7 KB

File metadata and controls

985 lines (865 loc) ยท 52.7 KB

Git๊ณผ Perforce

Perforce๋Š” ๊ธฐ์—…์—์„œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด๋‹ค. 1995๋…„ ๋ฌด๋ ต๋ถ€ํ„ฐ ์‚ฌ์šฉ๋์œผ๋ฉฐ ์ด ์žฅ์—์„œ ๋‹ค๋ฃจ๋Š” ์‹œ์Šคํ…œ ์ค‘์—์„œ ๊ฐ€์žฅ ์˜ค๋ž˜๋œ ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ์ด๋‹ค. ์ฒ˜์Œ Perforce๋ฅผ ๋งŒ๋“  ๋‹น์‹œ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์„ค๊ณ„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ช‡ ๊ฐ€์ง€ ํŠน์ง•์ด ์žˆ๋‹ค. ์–ธ์ œ๋‚˜ ์ค‘์•™ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ณ  ๋กœ์ปฌ์—๋Š” ํ•œ ๋ฒ„์ „๋งŒ ์ €์žฅํ•œ๋‹ค. Perforce๊ฐ€ ์ž˜ ๋งž๋Š” ์›Œํฌํ”Œ๋กœ๋„ ์žˆ๊ฒ ์ง€๋งŒ Git์„ ๋„์ž…ํ•˜๋ฉด ํ›จ์”ฌ ๋‚˜์€ ์›Œํฌํ”Œ๋กœ๋ฅผ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ ์ƒ๊ฐํ•œ๋‹ค.

Perforce์™€ Git์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€๋‹ค. ์ฒซ ๋ฒˆ์งธ๋Š” Perforce๊ฐ€ ์ œ๊ณตํ•˜๋Š” โ€œGit Fusionโ€ ์ด๋‹ค. Perforce Depot์˜ ์„œ๋ธŒํŠธ๋ฆฌ๋ฅผ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋Š” Git ์ €์žฅ์†Œ๋กœ ๋…ธ์ถœ ์‹œ์ผœ ์ค€๋‹ค. ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์€ git-p4๋ผ๋Š” ํด๋ผ์ด์–ธํŠธ Bridge๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Git์„ Perforce์˜ ํด๋ผ์ด์–ธํŠธ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ Perforce ์„œ๋ฒ„๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

Git Fusion

Perforce๋Š” Git Fusion(http://www.perforce.com/git-fusion ์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ)์ด๋ผ๋Š” ์ œํ’ˆ์„ ์ œ๊ณตํ•œ๋‹ค. ์ด ์ œํ’ˆ์€ Perforce ์„œ๋ฒ„์™€ ์„œ๋ฒ„์— ์žˆ๋Š” Git ์ €์žฅ์†Œ๋ฅผ ๋™๊ธฐํ™”ํ•œ๋‹ค.

Git Fusion ์„ค์น˜

Perforce ๋ฐ๋ชฌ๊ณผ Git Fusion์ด ํฌํ•จ๋œ ๊ฐ€์ƒ ๋จธ์‹  ์ด๋ฏธ์ง€๋ฅผ ๋‚ด๋ ค๋ฐ›๋Š” ๊ฒƒ์ด Git Fusion์„ ๊ฐ€์žฅ ์‰ฝ๊ฒŒ ์„ค์น˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ฐ€์ƒ๋จธ์‹  ์ด๋ฏธ์ง€๋Š” http://www.perforce.com/downloads/Perforce/20-User ์˜ Git Fusion ํƒญ์—์„œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. VirtualBox ๊ฐ™์€ ๊ฐ€์ƒํ™” ์†Œํ”„ํŠธ์›จ์–ด๋กœ ์ด ์ด๋ฏธ์ง€๋ฅผ ๋™์ž‘์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€์ƒ๋จธ์‹ ์„ ์ฒ˜์Œ ๋ถ€ํŒ…์‹œํ‚ค๋ฉด root, perforce, git ์„ธ Linux ๊ณ„์ •์˜ ์•”ํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜๋ผ๋Š” ํ™”๋ฉด๊ณผ ๊ฐ€์ƒ๋จธ์‹  ์ธ์Šคํ„ด์Šค ์ด๋ฆ„์„ ์ž…๋ ฅํ•˜๋ผ๋Š” ํ™”๋ฉด์ด ๋‚˜ํƒ€๋‚œ๋‹ค. ์ธ์Šคํ„ด์Šค ์ด๋ฆ„์€ ๊ฐ™์€ ๋„คํŠธ์›Œํฌ ์•ˆ์—์„œ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ตฌ๋ถ„ํ•˜๊ณ  ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ด๋ฆ„์ด๋‹ค. ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋งˆ์น˜๊ณ  ๋‚˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํ™”๋ฉด์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Git Fusion ๊ฐ€์ƒ๋จธ์‹  ๋ถ€ํŒ… ํ™”๋ฉด.
Figure 1. Git Fusion ๊ฐ€์ƒ๋จธ์‹  ๋ถ€ํŒ… ํ™”๋ฉด.

ํ™”๋ฉด์˜ 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 ์„ค์ •

Git Fusion์„ ์„ค์น˜ํ•˜๊ณ  ๋‚˜์„œ ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฏธ ์ž˜ ์“ฐ๊ณ  ์žˆ๋Š” Perforce ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์žˆ์œผ๋ฉด ๊ทธ๊ฑธ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. Perforce ์„œ๋ฒ„์˜ //.git-fusion ๋””๋ ‰ํ† ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ์„ ์ˆ˜์ •ํ•˜๋ฉด ๋œ๋‹ค. ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

$ tree
.
โ”œโ”€โ”€ objects
โ”‚ย ย  โ”œโ”€โ”€ repos
โ”‚ย ย  โ”‚ย ย  โ””โ”€โ”€ [...]
โ”‚ย ย  โ””โ”€โ”€ trees
โ”‚ย ย      โ””โ”€โ”€ [...]
โ”‚
โ”œโ”€โ”€ p4gf_config
โ”œโ”€โ”€ repos
โ”‚ย ย  โ””โ”€โ”€ Talkhouse
โ”‚ย ย      โ””โ”€โ”€ p4gf_config
โ””โ”€โ”€ users
    โ””โ”€โ”€ p4gf_usermap

498 directories, 287 files

objects ๋””๋ ‰ํ† ๋ฆฌ๋Š” 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 -> master

Git์€ ์ด๋ ‡๊ฒŒ Merge ํ•˜๊ณ  Push ํ•˜๋ฉด ์ž˜ ๋˜์—ˆ๊ฒ ๊ฑฐ๋‹ˆ ํ•œ๋‹ค. Perforce์˜ ๊ด€์ ์—์„œ README ํŒŒ์ผ์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์ƒ๊ฐํ•ด๋ณด์ž. Perforce ํžˆ์Šคํ† ๋ฆฌ๋Š” p4v ๊ทธ๋ž˜ํ”„ ๊ธฐ๋Šฅ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

Git์ด Push ํ•œ Perforce ๋ฆฌ๋น„์ „ ๊ฒฐ๊ณผ ๊ทธ๋ž˜ํ”„.
Figure 2. Git์ด Push ํ•œ Perforce ๋ฆฌ๋น„์ „ ๊ฒฐ๊ณผ ๊ทธ๋ž˜ํ”„.

Perforce์˜ ์ด๋Ÿฐ ํžˆ์Šคํ† ๋ฆฌ ๋ทฐ์–ด๋ฅผ ๋ณธ ์ ์ด ์—†๋‹ค๋ฉด ๋‹ค์†Œ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒ ์ง€๋งŒ Git ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ณด๋Š” ๊ฒƒ๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š๋‹ค. ๊ทธ๋ฆผ์€ README ํŒŒ์ผ์˜ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ๋ณด๋Š” ์ƒํ™ฉ์ด๋‹ค. ์™ผ์ชฝ ์œ„ ์ฐฝ์—์„œ README ํŒŒ์ผ๊ณผ ๊ด€๋ จ๋œ ๋ธŒ๋žœ์น˜์™€ ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ๋‚˜ํƒ€๋‚œ๋‹ค. ์˜ค๋ฅธ์ชฝ ์œ„ ์ฐฝ์—์„œ๋Š” ํŒŒ์ผ์˜ ๋ฆฌ๋น„์ „ ํžˆ์Šคํ† ๋ฆฌ ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์ฐฝ์—์„œ๋Š” ์ด ๊ทธ๋ž˜ํ”„์˜ ํฐ ๊ทธ๋ฆผ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์™ผ์ชฝ ์•„๋ž˜ ์ฐฝ์—๋Š” ์„ ํƒํ•œ ๋ฆฌ๋น„์ „์„ ์ž์„ธํžˆ ๋ณด์—ฌ์ค€๋‹ค(์ด ๊ทธ๋ฆผ์—์„œ๋Š” ๋ฆฌ๋น„์ „ 2 ๋‹ค)

Perforce์˜ ํžˆ์Šคํ† ๋ฆฌ ๊ทธ๋ž˜ํ”„์ƒ์œผ๋กœ๋Š” Git์˜ ํžˆ์Šคํ† ๋ฆฌ์™€ ๋˜‘ ๊ฐ™์•„ ๋ณด์ธ๋‹ค. ํ•˜์ง€๋งŒ, Perforce๋Š” 1 ๊ณผ 2 ์ปค๋ฐ‹์„ ์ €์žฅํ•  ๋งŒํ•œ ๋ธŒ๋žœ์น˜๊ฐ€ ์—†๋‹ค. ๊ทธ๋ž˜์„œ .git-fusion ๋””๋ ‰ํ† ๋ฆฌ ์•ˆ์— โ€œ์ต๋ช…โ€ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ ๋‹ค. Git ๋ธŒ๋žœ์น˜๊ฐ€ Perforce์˜ ๋ธŒ๋žœ์น˜์™€ ๋งค์น˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋„ ์ด์™€ ๊ฐ™์€ ๋ชจ์–‘์ด ๋œ๋‹ค(๋ธŒ๋žœ์น˜๊ฐ„ ๋งคํ•‘์€ ๋‚˜์ค‘์— ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค).

์ด๋Ÿฐ ์ž‘์—…๋“ค์€ Git Fusion ๋‚ด๋ถ€์—์„œ ๋ณด์ด์ง€ ์•Š๊ฒŒ ์ฒ˜๋ฆฌ๋œ๋‹ค. ๋ฌผ๋ก  ์ด ๊ฒฐ๊ณผ๋กœ Git ํด๋ผ์ด์–ธํŠธ๋กœ Perforce ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ˆ„๊ตฐ๊ฐ€๋Š” ์•Œ๊ฒŒ ๋œ๋‹ค.

Git-Fusion ์š”์•ฝ

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-p4๋„ Git๊ณผ Perforce๊ฐ„์˜ ์–‘๋ฐฉํ–ฅ Bridge์ด๋‹ค. Git-p4๋Š” ๋ชจ๋“  ์ž‘์—…์ด ํด๋ผ์ด์–ธํŠธ์ธ Git ์ €์žฅ์†Œ ์ชฝ์—์„œ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์— Perforce ์„œ๋ฒ„์— ๋Œ€ํ•œ ๊ถŒํ•œ์ด ์—†์–ด๋„ ๋œ๋‹ค. ๋ฌผ๋ก , ์ธ์ฆ ์ •๋ณด ์ •๋„๋Š” Perforce ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜๋‹ค. Git-p4๋Š” Git Fusion๋งŒํผ ์™„์„ฑ๋„ ๋†’๊ณ  ์œ ์—ฐํ•˜์ง€ ์•Š์ง€๋งŒ Perforce ์„œ๋ฒ„๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ ์„œ๋„ ๋Œ€๋ถ€๋ถ„์€ ๋‹ค ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

Note

git-p4๊ฐ€ ์ž˜ ๋™์ž‘ํ•˜๋ ค๋ฉด p4 ๋ช…๋ น์„ ์–ด๋””์—์„œ๋‚˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ PATH ์— ๋“ฑ๋กํ•ด๋‘์–ด์•ผ ํ•œ๋‹ค. p4 ๋Š” ๋ฌด๋ฃŒ๋กœ http://www.perforce.com/downloads/Perforce/20-User ์—์„œ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

์„ค์ •

์˜ˆ์ œ๋กœ ์‚ฌ์šฉํ•  Perforce ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ์•ž์—์„œ ์‚ดํŽด๋ณธ Git Fusion OVA ์ด๋ฏธ์ง€์˜ Perforce ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. Git Fusion ์„œ๋ฒ„ ์„ค์ •์€ ๊ฑด๋„ˆ๋›ฐ๊ณ  Perforce ์„œ๋ฒ„์™€ ์ €์žฅ์†Œ ์„ค์ • ๋ถ€๋ถ„๋งŒ ์„ค์ •ํ•˜๋ฉด ๋œ๋‹ค.

git-p4์ด ์˜์กดํ•˜๋Š” p4 ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ปค๋งจ๋“œ๋ผ์ธ์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ช‡ ๊ฐ€์ง€ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ๋จผ์ € ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

$ export P4PORT=10.0.1.254:1666
$ export P4USER=john
์‹œ์ž‘ํ•˜๊ธฐ

Git์—์„œ ๋ชจ๋“  ์‹œ์ž‘์€ 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/master

Git์˜ ์–ธ์–ด๋กœ ํ‘œํ˜„ํ•˜์ž๋ฉด ์œ„์˜ ๋ช…๋ น์€ โ€œ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 #head

git 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 #head

775a46f ์ปค๋ฐ‹ ์ดํ›„์— 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 #head

Rebase ํ•˜๊ณ  ๋‚˜์„œ ์ „์†กํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ์ผ์ง์„ ์ด ๋๋‹ค. ์ด ๊ฒฐ๊ณผ๋Š” Git์œผ๋กœ ์ž์œ ๋กญ๊ฒŒ ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค๊ณ  ๋ฒ„๋ฆฌ๊ณ  Merge ํ•ด๋„ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ๋งํ•ด์ค€๋‹ค. ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ Perforce์— ๋งž์ง€ ์•Š๋”๋ผ๋„ ๊ฑฑ์ •ํ•  ํ•„์š” ์—†๋‹ค. ๋ฌผ๋ก  ์ง์ ‘ Rebase ํ•ด์„œ Perforce ์„œ๋ฒ„๋กœ ์ „์†กํ•ด๋„ ๋œ๋‹ค.

๋ธŒ๋žœ์น˜

Perforce ํ”„๋กœ์ ํŠธ์— ๋ธŒ๋žœ์น˜๊ฐ€ ๋งŽ์•„๋„ ๊ดœ์ฐฎ๋‹ค. git-p4์€ Perforce ๋ธŒ๋žœ์น˜๋ฅผ Git ๋ธŒ๋žœ์น˜๋กœ ์ƒ๊ฐํ•˜๊ฒŒ ๋” ๋งŒ๋“ค์–ด ์ค€๋‹ค. Perforce Depot์ด ์•„๋ž˜์™€ ๊ฐ™๋‹ค๊ณ  ํ•˜์ž.

//depot
  โ””โ”€โ”€ project
      โ”œโ”€โ”€ main
      โ””โ”€โ”€ dev

dev ๋ธŒ๋žœ์น˜๊ฐ€ ์•„๋ž˜์™€ ๊ฐ™์€ 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 init

Depot ๊ฒฝ๋กœ์— โ€œ@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-Perforce ํ•จ๊ป˜์“ฐ๊ธฐ ์š”์•ฝ

git-p4 Perforce ์„œ๋ฒ„๋ฅผ ์“ฐ๋Š” ํ™˜๊ฒฝ์—์„œ๋„ Git์œผ๋กœ ์ผํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ฃผ์ฒด๋Š” Perforce์ด๊ณ  Git์€ ๋กœ์ปฌ์—์„œ๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์„ ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค. ๋”ฐ๋ผ์„œ Git ์ปค๋ฐ‹์„ Perforce ์„œ๋ฒ„๋กœ ๋ณด๋‚ด์„œ ๊ณต์œ ํ•  ๋•Œ๋Š” ํ•ญ์ƒ ์ฃผ์˜๊นŠ๊ฒŒ ์ž‘์—…ํ•ด์•ผ ํ•œ๋‹ค. ํ•œ ๋ฒˆ Perforce ์„œ๋ฒ„๋กœ ๋ณด๋‚ธ ์ปค๋ฐ‹์€ ๋‹ค์‹œ ๋ณด๋‚ด์„œ๋Š” ์•ˆ๋œ๋‹ค.

Perforce์™€ Git ํด๋ผ์ด์–ธํŠธ๋ฅผ ์ œ์•ฝ์—†์ด ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์„œ๋ฒ„ ๊ด€๋ฆฌ ๊ถŒํ•œ์ด ํ•„์š”ํ•˜๋‹ค. Git Fusion์€ Git์„ ๋งค์šฐ ์šฐ์•„ํ•œ Perforce ํด๋ผ์ด์–ธํŠธ๋กœ ๋งŒ๋“ค์–ด ์ค€๋‹ค.