git bundle create
หนึ่งในวิธีการที่จะใช้จัดเก็บข้อมูลภายนอกในการแลกเปลี่ยนข้อมูลระหว่างเก็บเป็นกำคอมไพล์ วิธีนี้คุณมีไฟล์เดียวสำหรับการถ่ายโอนแต่ละครั้งไม่ใช่ที่เก็บ Git ระดับกลาง
แต่ละ "git push" จะเปลี่ยนเป็นการสร้างไฟล์ "git fetch" ดึงสิ่งต่าง ๆ จากไฟล์นั้น
เซสชั่นการสาธิต
สร้างพื้นที่เก็บข้อมูลแรกและทำการ "push" ครั้งแรก
gitbundletest$ mkdir repo1
gitbundletest$ cd repo1
repo1$ git init
Initialized empty Git repository in /tmp/gitbundletest/repo1/.git/
repo1$ echo 1 > 1 && git add 1 && git commit -m 1
[master (root-commit) c8b9ff9] 1
1 file changed, 1 insertion(+)
create mode 100644 1
repo1$ git bundle create /tmp/1.bundle master HEAD
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 384 bytes | 384.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
"การโคลน" ไปยังที่เก็บข้อมูลที่สอง (เช่นคอมพิวเตอร์เครื่องที่สอง):
gitbundletest$ git clone /tmp/1.bundle repo2
Cloning into 'repo2'...
Receiving objects: 100% (3/3), done.
gitbundletest$ cd repo2/
repo2$ cat 1
1
ทำการเปลี่ยนแปลงบางอย่างและ "ผลักดัน" ไปยังไฟล์บันเดิลอื่น:
repo2$ echo 2 > 1 && git add 1 && git commit -m 2
[master 250d387] 2
1 file changed, 1 insertion(+), 1 deletion(-)
repo2$ git bundle create /tmp/2.bundle origin/master..master origin/HEAD..HEAD
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Writing objects: 100% (3/3), 415 bytes | 415.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
"pulling" เปลี่ยนเป็นที่เก็บแรก:
repo2$ cd ../repo1
repo1$ git pull /tmp/2.bundle
Receiving objects: 100% (3/3), done.
From /tmp/2.bundle
* branch HEAD -> FETCH_HEAD
Updating c8b9ff9..250d387
Fast-forward
1 | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
repo1$ cat 1
2
ต่างจากบันเดิลแรกอันที่สองมีประวัติ Git เพียงบางส่วนและไม่สามารถโคลนได้โดยตรง:
repo1$ cd ..
gitbundletest$ git clone /tmp/2.bundle repo3
Cloning into 'repo3'...
error: Repository lacks these prerequisite commits:
error: c8b9ff94942039469fa1937f6d38d85e0e39893a
fatal: bad object 250d38747656401e15eca289a27024c61e63ed68
fatal: remote did not send all necessary objects
มีข้อเสียในการใช้บันเดิลที่คุณต้องระบุช่วงของการคอมมิตแต่ละบันเดิลที่ควรมี ซึ่งแตกต่างgit push
, git bundle
ไม่ได้ติดตามสิ่งที่อยู่ในห่อก่อนหน้านี้คุณจำเป็นต้องปรับด้วยตนเองrefs/remotes/origin/master
หรือการรวมกลุ่มจะมีขนาดใหญ่กว่ามันอาจจะเป็น