Skip to content

Latest commit

ย 

History

History
256 lines (222 loc) ยท 12.9 KB

File metadata and controls

256 lines (222 loc) ยท 12.9 KB

Bundle

์•ž์—์„œ Git ๋ฐ์ดํ„ฐ๋ฅผ ๋„คํŠธ์›Œํฌ๋ฅผ ๊ฑฐ์ณ ์ „์†กํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•(HTTP, SSH๋“ฑ)์„ ๋‹ค๋ฃจ์—ˆ์—ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง„ ์•Š์ง€๋งŒ, ๊ฝค ์œ ์šฉํ•œ ๋ฐฉ๋ฒ•์ด ํ•˜๋‚˜ ๋” ์žˆ๋‹ค.

Git์—๋Š” โ€œBundleโ€ ์ด๋ž€ ๊ฒƒ์ด ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ํŒŒ์ผ์— ๋ชฐ์•„๋„ฃ๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•œ ๊ฒฝ์šฐ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋„คํŠธ์›Œํฌ๊ฐ€ ๋ถˆํ†ต์ธ๋ฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋™๋ฃŒ์—๊ฒŒ ๋ณด๋‚ผ ๋•Œ, ์ถœ์žฅ์„ ๋‚˜๊ฐ”๋Š”๋ฐ ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ๋กœ์ปฌ ๋„คํŠธ์›Œํฌ์— ์ ‘์†ํ•˜์ง€ ๋ชปํ•  ๋•Œ, ํ†ต์‹  ์ธํ„ฐํŽ˜์ด์Šค ์žฅ๋น„๊ฐ€ ๊ณ ์žฅ๋‚ฌ์„ ๋•Œ, ๊ฐ‘์ž๊ธฐ ๊ณต์šฉ ์„œ๋ฒ„์— ์ ‘๊ทผํ•˜์ง€ ๋ชปํ•  ๋•Œ, ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์ˆ˜์ •์‚ฌํ•ญ์„ ์ด๋ฉ”์ผ๋กœ ๋ณด๋‚ด์•ผ ํ•˜๋Š”๋ฐ 40๊ฐœ ์”ฉ์ด๋‚˜ ๋˜๋Š” ์ปค๋ฐ‹์„ format-patch ๋กœ ๋ณด๋‚ด๊ณ  ์‹ถ์ง€ ์•Š์„ ๋•Œ๋ฅผ ์˜ˆ๋กœ ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๋ฐ”๋กœ ์ด๋Ÿด ๋•Œ git bundle ์ด ํ•œ ์ค„๊ธฐ ๋น›์ด ๋˜์–ด์ค€๋‹ค. bundle ๋ช…๋ น์€ ๋ณดํ†ต git push ๋ช…๋ น์œผ๋กœ ์˜ฌ๋ ค ๋ณด๋‚ผ ๋ชจ๋“  ๊ฒƒ์„ ๊ฐ์‹ธ์„œ ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ํŒŒ์ผ๋กœ ๋งŒ๋“ ๋‹ค. ์ด ํŒŒ์ผ์„ ์ด๋ฉ”์ผ๋กœ ๋ณด๋‚ด๊ฑฐ๋‚˜ USB๋กœ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ๋ณด๋‚ด์„œ ๋‹ค๋ฅธ ์ €์žฅ์†Œ์— ํ’€์–ด์„œ(Unbundle) ์‚ฌ์šฉํ•œ๋‹ค.

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๋ณด์ž. ์ด ์ €์žฅ์†Œ์—๋Š” ์ปค๋ฐ‹ ๋‘ ๊ฐœ๊ฐ€ ์žˆ๋‹ค.

$ git log
commit 9a466c572fe88b195efd356c3f2bbeccdb504102
Author: Scott Chacon <schacon@gmail.com>
Date:   Wed Mar 10 07:34:10 2010 -0800

    second commit

commit b1ec3248f39900d2a406049d762aa68e9641be25
Author: Scott Chacon <schacon@gmail.com>
Date:   Wed Mar 10 07:34:01 2010 -0800

    first commit

์ด ์ €์žฅ์†Œ๋ฅผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ํ†ต์งธ๋กœ ๋ณด๋‚ด๊ณ  ์‹ถ์€๋ฐ ๊ทธ ์‚ฌ๋žŒ์˜ ์ €์žฅ์†Œ์— Push ํ•  ๊ถŒํ•œ์ด ์—†๊ฑฐ๋‚˜, ๊ทธ๋ƒฅ Push ํ•˜๊ณ  ์‹ถ์ง€ ์•Š์„ ๋•Œ, git bundle create ๋ช…๋ น์œผ๋กœ Bundle์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

$ git bundle create repo.bundle HEAD master
Counting objects: 6, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (6/6), 441 bytes, done.
Total 6 (delta 0), reused 0 (delta 0)

์ด๋ ‡๊ฒŒ repo.bundle ์ด๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํŒŒ์ผ์—๋Š” ์ด ์ €์žฅ์†Œ์˜ master ๋ธŒ๋žœ์น˜๋ฅผ ๋‹ค์‹œ ๋งŒ๋“œ๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ๋‹ค ๋“ค์–ด ์žˆ๋‹ค. bundle ๋ช…๋ น์œผ๋กœ ๋ชจ๋“  Refs๋ฅผ ํฌํ•จํ•˜๊ฑฐ๋‚˜ Bundle์— ํฌํ•จํ•  ํŠน์ • ๊ตฌ๊ฐ„์˜ ์ปค๋ฐ‹์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด Bundle์„ ๋‹ค๋ฅธ ๊ณณ์—์„œ Clone ํ•˜๋ ค๋ฉด ์œ„์˜ ๋ช…๋ น์ฒ˜๋Ÿผ HEAD Refs๋ฅผ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค.

repo.bundle ํŒŒ์ผ์„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ์ด๋ฉ”์ผ๋กœ ์ „์†กํ•˜๊ฑฐ๋‚˜ USB ๋“œ๋ผ์ด๋ธŒ์— ๋‹ด์•„์„œ ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

ํ˜น์€ repo.bundle ํŒŒ์ผ์„ ์ผํ•  ๊ณณ์œผ๋กœ ์–ด๋–ป๊ฒŒ๋“  ๋ณด๋‚ด๋†“์œผ๋ฉด ์ด Bundle ํŒŒ์ผ์„ ๋งˆ์น˜ URL์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ์ฒ˜๋Ÿผ Clone ํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

$ git clone repo.bundle repo
Cloning into 'repo'...
...
$ cd repo
$ git log --oneline
9a466c5 second commit
b1ec324 first commit

Bundle ํŒŒ์ผ์— HEAD Refs๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์œผ๋ ค๋ฉด -b master ์˜ต์…˜์„ ์จ์ฃผ๊ฑฐ๋‚˜ ํฌํ•จ์‹œํ‚ฌ ๋ธŒ๋žœ์น˜๋ฅผ ์ง€์ •ํ•ด์ค˜์•ผ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Git์€ ์–ด๋–ค ๋ธŒ๋žœ์น˜๋กœ Checkout ํ• ์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค.

์ด์ œ ์ƒˆ ์ปค๋ฐ‹ ์„ธ ๊ฐœ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ์ฑ„์šด ์ €์žฅ์†Œ๋ฅผ ๋‹ค์‹œ ์›๋ž˜ Bundle์„ ๋งŒ๋“ค์—ˆ๋˜ ์ €์žฅ์†Œ๋กœ USB๋“  ๋ฉ”์ผ์ด๋“  Bundle๋กœ ๋ณด๋‚ด ์ƒˆ ์ปค๋ฐ‹์„ ์˜ฎ๊ฒจ๋ณด์ž.

$ git log --oneline
71b84da last commit - second repo
c99cf5b fourth commit - second repo
7011d3d third commit - second repo
9a466c5 second commit
b1ec324 first commit

๋จผ์ € Bundle ํŒŒ์ผ์— ์ถ”๊ฐ€์‹œํ‚ฌ ์ปค๋ฐ‹์˜ ๋ฒ”์œ„๋ฅผ ์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ „์†กํ•  ์ตœ์†Œํ•œ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์•Œ์•„์„œ ์ธ์‹ํ•˜๋Š” ๋„คํŠธ์›Œํฌ ํ”„๋กœํ† ์ฝœ๊ณผ๋Š” ๋‹ฌ๋ฆฌ Bundle ๋ช…๋ น์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ˆ˜๋™์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค. ์ „์ฒด ์ €์žฅ์†Œ๋ฅผ Bundle ํŒŒ์ผ๋กœ ๋งŒ๋“ค ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ์ฐจ์ด์ ๋งŒ Bundle๋กœ ๋ฌถ๋Š” ๊ฒŒ ์ข‹๋‹ค. ์˜ˆ์ œ์—์„œ๋Š” ๋กœ์ปฌ์—์„œ ๋งŒ๋“  ์„ธ ๊ฐœ์˜ ์ปค๋ฐ‹๋งŒ ๋ฌถ๋Š”๋‹ค.

์šฐ์„  ์ฐจ์ด์ ์„ ์ฐพ์•„๋‚ด์•ผ Bundle ํŒŒ์ผ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ch07-git-tools.asc์—์„œ ์‚ดํŽด๋ณธ ๋Œ€๋กœ ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปค๋ฐ‹์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์›๋ž˜ Clone ํ•œ ๋ธŒ๋žœ์น˜์ธ master์—๋Š” ์—†๋˜ ์„ธ ๊ฐœ์˜ ์ปค๋ฐ‹์„ ์–ป์–ด๋‚ด๋ ค๋ฉด origin/master..master ๋˜๋Š” master ^origin/master ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์“ฐ๋ฉด ๋œ๋‹ค. log ๋ช…๋ น์œผ๋กœ ์‹œํ—˜ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

$ git log --oneline master ^origin/master
71b84da last commit - second repo
c99cf5b fourth commit - second repo
7011d3d third commit - second repo

์ด์ œ Bundle ํŒŒ์ผ์— ํฌํ•จํ•  ์ปค๋ฐ‹์„ ์–ป์—ˆ์œผ๋‹ˆ ๋ฌถ์–ด๋ณด์ž. git bundle create ๋ช…๋ น์— Bundle ํŒŒ์ผ์˜ ์ด๋ฆ„๊ณผ ๋ฌถ์–ด ๋„ฃ์„ ์ปค๋ฐ‹์˜ ๋ฒ”์œ„๋ฅผ ์ง€์ •ํ•œ๋‹ค.

$ git bundle create commits.bundle master ^9a466c5
Counting objects: 11, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (9/9), 775 bytes, done.
Total 9 (delta 0), reused 0 (delta 0)

์ด์ œ ๋””๋ ‰ํ† ๋ฆฌ์— commits.bundle ํŒŒ์ผ์ด ์ƒ๊ฒผ๋‹ค. ์ด ํŒŒ์ผ์„ ๋™๋ฃŒ์—๊ฒŒ ๋ณด๋‚ด๋ฉด ์›๋ž˜์˜ ์ €์žฅ์†Œ์— ์ผ์ด ์–ผ๋งˆ๋‚˜ ์ง„ํ–‰๋˜์—ˆ๋“  ๊ฐ„์— ํŒŒ์ผ ๋‚ด์šฉ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด Bundle ํŒŒ์ผ์„ ๋™๋ฃŒ๊ฐ€ ๋ฐ›์•˜์œผ๋ฉด ์›๋ž˜ ์ €์žฅ์†Œ์— ์ ์šฉํ•˜๊ธฐ ์ „์— ๋ฌด์—‡์ด ๋“ค์–ด ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์šฐ์„  bundle verify ๋ช…๋ น์œผ๋กœ ํŒŒ์ผ์ด ์˜ฌ๋ฐ”๋ฅธ Git Bundle์ธ๊ฐ€, ์ œ๋Œ€๋กœ ์ ์šฉํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ํžˆ์Šคํ† ๋ฆฌ๊ฐ€ ํ˜„์žฌ ์ €์žฅ์†Œ์— ์žˆ๋Š”๊ฐ€ ํ™•์ธํ•œ๋‹ค.

$ git bundle verify ../commits.bundle
The bundle contains 1 ref
71b84daaf49abed142a373b6e5c59a22dc6560dc refs/heads/master
The bundle requires these 1 ref
9a466c572fe88b195efd356c3f2bbeccdb504102 second commit
../commits.bundle is okay

๋งŒ์•ฝ ์•ž์—์„œ Bundle ํŒŒ์ผ์„ ๋งŒ๋“ค ๋•Œ ์ปค๋ฐ‹ ์„ธ ๊ฐœ๋กœ ๋งŒ๋“ค์ง€ ์•Š๊ณ  ๋งˆ์ง€๋ง‰ ๋‘ ์ปค๋ฐ‹์œผ๋กœ๋งŒ Bundle ํŒŒ์ผ์„ ๋งŒ๋“ค๋ฉด ์ปค๋ฐ‹์ด ๋ชจ์ž๋ผ๊ธฐ ๋•Œ๋ฌธ์— ์ตœ์ดˆ์— Bundle์„ ๋งŒ๋“ค์—ˆ๋˜ ์ €์žฅ์†Œ์— ์ƒˆ Bundle ํŒŒ์ผ์„ ํ•ฉ์น  ์ˆ˜ ์—†๋‹ค. ์ด๋Ÿฐ ๋ฌธ์ œ๋ฅผ verify ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

$ git bundle verify ../commits-bad.bundle
error: Repository lacks these prerequisite commits:
error: 7011d3d8fc200abe0ad561c011c3852a4b7bbe95 third commit - second repo

์ œ๋Œ€๋กœ ๋งŒ๋“  Bundle ํŒŒ์ผ์ด๋ผ๋ฉด ์ปค๋ฐ‹์„ ๊ฐ€์ ธ์™€์„œ ์ตœ์ดˆ ์ €์žฅ์†Œ์— ํ•ฉ์น  ์ˆ˜ ์žˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ Bundle ํŒŒ์ผ์— ์–ด๋–ค ๋ธŒ๋žœ์น˜๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๋ ค๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์œผ๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

$ git bundle list-heads ../commits.bundle
71b84daaf49abed142a373b6e5c59a22dc6560dc refs/heads/master

์•ž์—์„œ verify ๋ช…๋ น์„ ์‹คํ–‰ํ–ˆ์„ ๋•Œ๋„ ๋ธŒ๋žœ์น˜ ์ •๋ณด๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•˜๊ฒŒ ์งš์„ ๋ถ€๋ถ„์€ fetch ๋ช…๋ น์ด๋‚˜ pull ๋ช…๋ น์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ๋Œ€์ƒ์ด ๋˜๋Š” ๋ธŒ๋žœ์น˜๋ฅผ Bundle ํŒŒ์ผ์—์„œ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Bundle ํŒŒ์ผ์˜ master ๋ธŒ๋žœ์น˜๋ฅผ ์ž‘์—…ํ•˜๋Š” ์ €์žฅ์†Œ์˜ 'other-master' ๋ธŒ๋žœ์น˜๋กœ ๊ฐ€์ ธ์˜ค๋Š” ๋ช…๋ น์€ ์•„๋ž˜์™€ ๊ฐ™์ด ์‹คํ–‰ํ•œ๋‹ค.

$ git fetch ../commits.bundle master:other-master
From ../commits.bundle
 * [new branch]      master     -> other-master

์ด๋Ÿฐ ์‹์œผ๋กœ ์ž‘์—…ํ•˜๋˜ ์ €์žฅ์†Œ์˜ 'master' ๋ธŒ๋žœ์น˜์— ์–ด๋–ค ์ž‘์—…์„ ํ–ˆ๋“  ์ƒ๊ด€์—†์ด Bundle ํŒŒ์ผ๋กœ๋ถ€ํ„ฐ ์ปค๋ฐ‹์„ ๋…๋ฆฝ์ ์œผ๋กœ 'other-master' ๋ธŒ๋žœ์น˜๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

$ git log --oneline --decorate --graph --all
* 8255d41 (HEAD, master) third commit - first repo
| * 71b84da (other-master) last commit - second repo
| * c99cf5b fourth commit - second repo
| * 7011d3d third commit - second repo
|/
* 9a466c5 second commit
* b1ec324 first commit

git bundle ๋ช…๋ น์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ๋„คํŠธ์›Œํฌ ์ƒํ™ฉ์ด ์—ฌ์˜์น˜ ์•Š๊ฑฐ๋‚˜ ์‰ฝ๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ €์žฅ์†Œ๋ฅผ ์ค€๋น„ํ•˜๊ธฐ ์–ด๋ ค์šธ ๋•Œ๋„ ํžˆ์Šคํ† ๋ฆฌ๋ฅผ ์‰ฝ๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.