git bundle create
Một trong những phương pháp là sử dụng bộ nhớ ngoài để trao đổi dữ liệu giữa các kho lưu trữ là gói git . Bằng cách này, bạn chỉ có các tệp duy nhất cho mỗi lần chuyển, không phải kho lưu trữ Git trung gian.
Mỗi "git đẩy" biến thành việc tạo một tệp, "git fetch" tìm nạp mọi thứ từ tệp đó.
Phiên demo
Tạo kho lưu trữ đầu tiên và thực hiện "đẩy" đầu tiên
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)
"Nhân bản" vào kho lưu trữ thứ hai (tức là máy tính thứ hai):
gitbundletest$ git clone /tmp/1.bundle repo2
Cloning into 'repo2'...
Receiving objects: 100% (3/3), done.
gitbundletest$ cd repo2/
repo2$ cat 1
1
Thực hiện một số thay đổi và "đẩy" chúng sang tệp bó khác:
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)
"kéo" thay đổi vào kho lưu trữ đầu tiên:
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
Không giống như gói đầu tiên, gói thứ hai chỉ chứa một phần lịch sử Git và không thể nhân bản trực tiếp:
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
Có một bất lợi trong việc sử dụng các gói mà bạn cần chỉ định thủ công phạm vi cam kết mà mỗi gói nên chứa. Không giống như git push
, git bundle
không theo dõi những gì trong gói trước, bạn cần điều chỉnh thủ công refs/remotes/origin/master
hoặc các gói sẽ lớn hơn mức có thể.