git bundle create
एक तरीका यह है कि रिपॉजिटरी के बीच डेटा का आदान-प्रदान करने के लिए बाहरी भंडारण का उपयोग किया जाता है । इस तरह आपके पास केवल प्रत्येक हस्तांतरण के लिए एकल फाइलें हैं, मध्यवर्ती Git रिपॉजिटरी नहीं।
प्रत्येक "गिट पुश" एक फ़ाइल के निर्माण में बदल जाता है, "गिट फ़िश" उस फ़ाइल से चीजों को प्राप्त करता है।
डेमो सत्र
पहला रिपॉजिटरी बनाना और पहला "पुश" करना
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)
पहली रिपॉजिटरी में "पुलिंग" परिवर्तन:
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
पहले बंडल के विपरीत, दूसरे में केवल आंशिक गिट इतिहास शामिल है और यह सीधे क्लोन करने योग्य नहीं है:
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
या बंडल से बड़ा हो सकता है।