कैसे एक पूरा रेपो बंडल करने के लिए


116

मुझे एक पूरी रीपो को एक नई गैर-नेटवर्क मशीन में स्थानांतरित करने की आवश्यकता है, जो एक एकल फ़ाइल इकाई के रूप में बेहतर है। गीत बंडल एक चुपके वातावरण में एक git fetch, git pullस्टाइल ऑपरेशन की अनुमति देता है , लेकिन लगता है कि आपके पास पहले से ही गंतव्य मशीन पर रेपो का एक कार्यशील संस्करण है।

सही आह्वान क्या है:

  1. वर्तमान रेपो में सभी शाखाओं को बंडल करें
  2. गंतव्य निर्देशिका पर नए रेपो को शुरू करें, यानी रूट कमिट को सही तरीके से स्थापित करें

मैंने स्पष्ट करने के लिए एक पैच अपस्ट्रीम भेजा है:

`git clone` can use any bundle created without negative refspecs
(e.g., `new`, but not `old..new`).
If you want to match `git clone --mirror`, which would clone other
refs such as `refs/remotes/*`, use `--all`.
If you want to provide the same set of refs that a clone directly
from the source repository would get, use `--branches --tags` for
the `<git-rev-list-args>`.

इसलिए $ git bundle create repo.bundle --branches --tagsक्लोनिंग से सबसे अच्छा मेल खाता है।

$ git bundle create repo.bundle --all आपके स्रोत मशीन की एक मिरर छवि प्रदान करेगा, जिसमें यह दूरस्थ रेफरी भी शामिल है।

जवाबों:


190

सही आह्वान क्या है:

  • वर्तमान रेपो में सभी शाखाओं को बंडल करें

सरल:

$ git bundle create repo.bundle --all

यहां repo.bundleबंडल फ़ाइल का नाम है जिसे आप बनाना चाहते हैं। ध्यान दें कि --allइसमें रिमोट-ट्रैकिंग शाखाएं शामिल नहीं होंगी ... ठीक वैसे ही जैसे साधारण क्लोन या तो नहीं होता।

  • गंतव्य निर्देशिका पर नए रेपो को शुरू करें, यानी रूट कमिट को सही तरीके से स्थापित करें

सबसे पहले, cloneबस init+ fetch(+ व्यवस्थापिका) है।

दूसरा, आप हर जगह बंडल फ़ाइल का उपयोग कर सकते हैं रिपॉजिटरी URL का उपयोग किया जा सकता है, इसलिए आप बस cloneएक बंडल फ़ाइल से कर सकते हैं :

$ git clone repo.bundle

यह repoएक जीत भंडार के रूप में पैदा करेगा ।


6
धन्यवाद, --allविकल्प मेरे मैन पेज के लिए नहीं है bundle(मैं संस्करण 1.7.6.msysgit.0 देख रहा हूं), और न ही इसके लिए URL अनुभाग में .bundle फ़ाइल का उपयोग किया गया है clone। यह मुझे इसके उपयोग की सिफारिश करने के लिए अधिक आत्मविश्वास देता है।
फिलिप ओकले

20
कमांड बनाने के लिए सारांश है git bundle create <file> <git-rev-list-args>। रनिंग man git-rev-list(या man git-log) आपको देगा --all। लेकिन मैं मानता हूं कि यह बंडल कमांड प्रलेखन में अधिक दिखाई देना चाहिए।
जकूब नारबस्की

1
मैं देख रहा हूं कि निर्दिष्ट संदर्भ के तहत बंडल मैन पेज, कहता है कि यह "केवल वही रीफ पैकेज दिखाएंगे जो git show-ref" द्वारा दिखाए गए हैं , जिसमें गिट-रेव-लिस्ट विकल्प शामिल नहीं हैं।
फिलिप ओकले

2
@Philip Oakley: git-rev-list-argsआप कैसे रीफ्स का चयन करते हैं जो git show-refकमांड द्वारा दिखाए जाते हैं ।
जैकब नार

2
--allमेरे लिए रिमोट-ट्रैकिंग शाखाएं शामिल थीं (git 2.1.4)। मैं या के refs/remotes/origin/*साथ देख सकता था । हालांकि उन्हें बंडल से वापस प्राप्त करना थोड़ा मुश्किल है। git bundle list-heads bundlefilegit ls-remote bundlefile
एलेक्स

33

पहले रिपॉजिटरी को क्लोन करें, और --mirrorविकल्प को शामिल करें ।

git clone --mirror git@example.org:path/repo.git

यह सुनिश्चित करता है कि सभी दूरस्थ शाखाएं भी बंडल के लिए तैयार स्थानीय शाखाएं हैं।

फिर भागो

git bundle create repo.bundle --all जैसा कि जैकब नारबस्की के उत्तर से वर्णित है


3

मेरा सुझाव है कि आप .it फ़ोल्डर को टार या ज़िप करें और बस इसे नए स्थान पर अनपैक करें और फिर करें git reset --hard HEAD। सभी शाखाओं के लिए आवश्यक सब कुछ अंडरस्टैंडिंग है। और आपको जो कुछ भी करने की आवश्यकता है, उसे .it / config फाइल में मौजूद किसी भी रिमोट को समायोजित करने या उन्हें हटाने के लिए करना चाहिए।

tar cf myrepo.tgz .git
cp myrepo.tgz [USB_STICK]
... move to new machine ...
mkdir myrepo && cd myrepo
tar xpf [USB_STICK]/myrepo.tgz
git reset --hard HEAD

4
एक चेतावनी यह है कि आपको यह देखने के लिए .it / config फाइल देखने की आवश्यकता होगी कि मूल रेपो मालिक के पास कोई उपयोगकर्ता विशिष्ट सामान था या नहीं।
नौफाल इब्राहिम

@patthoyts: यह देखते हुए कि यह डिस्कनेक्ट है, वहाँ कोई रिमोट होगा ;-) यह बंडल की तरह देखो (हो सकता है) है एक विकल्प क्लोन (एक बंडल से क्लोनिंग के बारे में सोचने की जरूरत) याद आ रही है, और हो सकता है
फिलिप ओकले
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.