git bundle create
Salah satu metode adalah dengan menggunakan penyimpanan eksternal untuk bertukar data antara repositori adalah git bundle . Dengan cara ini Anda hanya memiliki satu file untuk setiap transfer, bukan repositori Git menengah.
Setiap "git push" berubah menjadi pembuatan file, "git fetch" mengambil sesuatu dari file itu.
Sesi demo
Membuat repositori pertama dan melakukan "push" pertama
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)
"kloning" ke repositori kedua (yaitu komputer kedua):
gitbundletest$ git clone /tmp/1.bundle repo2
Cloning into 'repo2'...
Receiving objects: 100% (3/3), done.
gitbundletest$ cd repo2/
repo2$ cat 1
1
Melakukan beberapa perubahan dan "mendorong" mereka ke file bundel lain:
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)
"menarik" perubahan ke repositori pertama:
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
Berbeda dengan bundel pertama, bundel kedua hanya berisi sebagian riwayat Git dan tidak dapat dikloning secara langsung:
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
Ada kerugian dalam menggunakan bundel yang harus Anda tentukan secara manual berapa kisaran komit yang harus dikandung setiap bundel. Tidak seperti git push
, git bundle
tidak melacak apa yang ada di bundel sebelumnya, Anda perlu menyesuaikan secara manual refs/remotes/origin/master
atau bundel akan lebih besar dari yang seharusnya.