2009-05-29 9 views
43

में निजी शाखाओं का बैक अप कैसे लें मेरे पास गिट में दिन-प्रतिदिन देव काम के लिए एक स्थानीय शाखा है। मेरे कार्यप्रवाह है:गिट

  1. local_branch पर सामान करते हैं, के लिए प्रतिबद्ध
  2. लायें मूल/मास्टर
  3. रिबेस local_branch मूल/गुरु से नई सामग्री के साथ पकड़ने के लिए

यह सब ठीक काम करता है, फिर भी मुझे मिली अधिकांश सिफारिशें कहती हैं कि किसी को निजी शाखाओं को "धक्का" नहीं देना चाहिए, जिस पर नियमित रूप से रीबेज किया जाता है।

समस्या यहाँ कि इस मामले में स्थानीय शाखा एक सर्वर और एक ही तरीका है को बचाने के लिए करने के लिए ऊपर का समर्थन नहीं है काम (यानी मूल/गुरु)

"pushable" शाखा में इसे वापस मर्ज करने के लिए है क्या इस मामले में वर्कफ़्लो पर आपकी सिफारिशें होंगी?

धन्यवाद!

अद्यतन: मुझे एहसास हुआ कि मूल आवश्यकताओं को मैं (बाहरी उपयोगिताओं के उपयोग से परहेज) था में से एक सीमित अनावश्यक है।

मेरा वर्तमान समाधान क्लाउड-सिंक्रनाइज़ फ़ोल्डर में मेरे सभी भंडारों को स्टोर करना है - इस तरह से मुझे बैकअप मुफ्त में मिलता है।

उत्तर

48

मैं --mirror विकल्प का उपयोग और एक व्यक्तिगत बैकअप भंडार करने के लिए धक्का:

git remote add bak server:/path/to/backup/repo 

बैकअप कार्य करें::

एक रिमोट के रूप में यह जोड़े

git push --mirror bak 

यह स्वचालित रूप से होगा अपनी बैकअप रिपोजिटरी को अपनी सक्रिय एक जैसी दिखें - शाखाओं को आवश्यकतानुसार बनाया जाएगा, हटाया जाएगा, अपडेट किया जाएगा (यहां तक ​​कि मजबूर/गैर-फास्टफोर्स) भी। आप यह भी के लिए एक उपनाम बना सकते हैं:

git config alias.bak "push --mirror bak" 

फिर, यह सिर्फ चल "Git बक" जब आप एक बैकअप करना चाहते हैं की बात है। आप इसे एक क्रॉन नौकरी में भी फेंक सकते हैं।

+0

--mirror और config alias के लिए धन्यवाद, इसमें – Art

+0

देखेंगे बस एक सिर ऊपर, यह आपकी कॉन्फ़िगरेशन फ़ाइलों को आपकी '.git' निर्देशिका (' config', 'hooks/*', आदि) से मिरर नहीं करेगा। । बिलकुल चौकन्ना। फिर भी, मुझे लगता है कि यह एक अच्छा समाधान है। –

1

क्या आप एक और रिमोट रिपोजिटरी सेट अप कर सकते हैं जिसे आप अपनी सभी शाखाओं को धक्का देते हैं? विचार करने की दूसरी बात यह है कि गिट रेपो समेत आपकी स्थानीय मशीन पर सब कुछ (महत्वपूर्ण) का बैक अप लेना।

+1

अलग भंडार स्थापित करने के मामले में मुझे अभी भी बदले गए इतिहास की समस्या होगी - यानी मैं – Art

2

उसी शाखा को धक्का देने में कुछ भी गलत नहीं है जिसे आप रिब्रेस कर रहे हैं। इन आरेखों को यह स्पष्ट करना चाहिए कि यह ठीक काम क्यों करता है:

आइए कहें कि ऐसा लगता है कि यह प्रतिबद्ध ग्राफ है जैसे आपने स्थानीय_ब्रैंच को ब्रांच किया है और इसमें कुछ प्रतिबद्धताएं हैं (सी और डी)। किसी अन्य व्यक्ति ने एक मूल/मास्टर के लिए प्रतिबद्ध (ई) के बाद से आप local_branch branched बना दिया है:

 
A -- B -- E [origin/master] 
     \ 
     \  
     \-- C -- D [local_branch] 

फिर चल "Git rebase मूल/मास्टर", प्रतिबद्ध ग्राफ अगले चित्र की तरह दिखाई देगा के बाद। "मूल/मास्टर" अभी भी वही है, लेकिन "local_branch" रिबेस किया गया है:

 
A -- B -- E [origin/master] 
      \ 
      \ 
      \-- C -- D [local_branch] 

इस स्तर पर, यदि आप ऐसा "Git धक्का मूल local_branch: मास्टर", तो यह एक साधारण तेजी का परिणाम देगा आगे। "मूल/मास्टर" और "local_branch" समान होगा:

 
A -- B -- E -- C -- D [origin/master],[local_branch] 

अब आप "local_branch" पर अधिक काम करने के लिए स्वतंत्र हैं। आखिरकार आपको ऐसा कुछ मिल सकता है:

 
A -- B -- E -- C -- D -- G -- I [origin/master] 
        \ 
         \ 
         \-- F -- H [local_branch] 

नोटिस यह प्रारंभिक ग्राफ की तरह दिखता है। आप इस प्रक्रिया को बार-बार दोहरा सकते हैं।

आपको अन्य शाखा को धक्का देने से बचना चाहिए, जिसे आप रिब्रेस नहीं कर रहे हैं। यही वह जगह है जहां आप परेशानी में भाग लेंगे (दूसरी शाखा में, ऐसा लगता है कि "मूल/मास्टर" से पुनः प्राप्त होने के बाद, यह आपके "स्थानीय_ब्रैंच के" इतिहास को फिर से लिखा गया है)।

+1

को रिबेस के बाद सीधे धक्का नहीं दे पाऊंगा। यह काफी नहीं है जो मैं चाहता हूं। मान लीजिए कि काम प्रगति पर है और मैं इसे मास्टर में विलय नहीं करना चाहता हूं और बस इसे बैकअप लेना चाहता हूं। – Art

+0

ओह, मैंने पूरी तरह से आपके प्रश्न को गलत समझा। उसके लिए माफ़ करना। ऐसा लगता है कि एक उचित समाधान आपके स्थानीय भंडार को किसी स्थान पर क्लोन करना होगा जिसे * बैक अप किया गया है। अपने बैकअप को अद्यतित रखने के लिए बस समय-समय पर पुनः क्लोन करें। लेकिन आपको क्लोन में किसी भी काम की जरुरत नहीं है (आप एक नया बैकअप बनाने के लिए फिर से क्लोन करने से पहले इसे हटा सकते हैं)। –

+0

@Dan, क्या यह वर्कफ़्लो है जिसे आप "गिट पुल --rebase" करते समय प्राप्त करेंगे? – cmcginty

1

Here's what I do। लेकिन - यह निजी नहीं है। मैं ऐसा करता हूं ताकि मैं अपने साथ सहयोग कर सकूं (इसलिए बोलने के लिए)। यह मुझे दो या दो से अधिक बक्से पर एक ही शाखा पर काम करने देता है। अगर अन्य लोगों को साझा रेपो तक पहुंच थी, तो वे उस काम को देख सकते थे जो मैं शाखा में कर रहा हूं। बेशक, मेरे घर के प्रतिनिधि पर, किसी और के पास पहुंच नहीं है, इसलिए यह अभी भी निजी है। जिथूब पर, सारी दुनिया मेरी सामग्री देख सकती थी। जैसे वे वास्तव में परवाह करते हैं। ;)

+0

आप किसी भी रिबेज नहीं कर रहे हैं, जो कि मेरे पास वास्तविक समस्या है। – Art

+0

क्या यह आपकी स्थानीय प्रतिलिपि "गिट पुल" करने के लिए काम नहीं करेगा, फिर स्थानीय रूप से रीबेस करें? फिर आपकी स्थानीय शाखा में मास्टर के सभी परिवर्तन विलय हो जाएंगे, और अगला पुश रिमोट शाखा में धक्का देगा। मुझे यह सुनिश्चित करने के लिए यह कोशिश करनी होगी, लेकिन ऐसा लगता है कि यह काम करेगा। –

+0

डॉन, गैर निजी शाखा पर रिबेस के बाद अगला पुल एक संघर्ष का कारण बनता है। – Art

4

एक अन्य विकल्प "मूल" रेपो करने के लिए "local_branch" पुश करने के लिए होगा, लेकिन यह है कि रेपो में खुद शाखा में (नहीं "मास्टर"), अर्थात्:

git push origin local_branch:local_backup

फिर जब यदि आप किसी अन्य बैकअप बनाने के लिए तैयार हैं (और तुम्हारे जाने के बाद कुछ काम और रिबेसिंग कर रहा हूँ) बस से पहले आप इसे फिर से बाहर धक्का मूल रेपो से बैकअप शाखा को हटा दें:

git push origin :local_backup < === मूल से शाखा को हटा देता है

git push origin local_branch:local_backup

इस तरह आप "local_branch" धक्का देने के बाद यह "मूल/मास्टर" से रिबेस किया गया है समस्याओं में नहीं चलेंगे।

और अगर आपके बैकअप शाखाओं को हटाने आप परेशान करता है (जब तक आप अंत में अपने काम करने के लिए "मास्टर" प्रतिबद्ध है), तो आप हमेशा एक नए नाम के साथ एक नई शाखा करने के लिए जोर दे रहा है (जैसे "local_backup1" रख सकता है, "local_backup2 ", आदि)।

+0

अगर कोई पुश-फोर्स का उपयोग करता है तो एक अनावश्यक कदम हटाना होगा? – Art

+0

हां, - बल हटाने के लिए एक अच्छा विकल्प है। यह रिमोट ब्रांच हेड को आपकी स्थानीय शाखा से नए के साथ बदल देगा। –

+0

डिफॉल्ट रूप से, रिमोट रिपोजिटरी गैर-तेज़ आगे अस्वीकार कर देंगे ताकि फोर्स पर्याप्त न हो। http://stackoverflow.com/questions/253055/how-do-i-push-amended-commit-to-the-remote-git-repo/255080#255080 –

3

व्यक्तिगत शाखाओं को धक्का देने में कुछ भी गलत नहीं है। यह आम तौर पर निराश होता है क्योंकि लोग आपकी शाखा के आधार पर काम शुरू कर सकते हैं, और जब आप रिबेस करते हैं, तो उनके परिवर्तन फ़्लोटिंग छोड़ दिए जाते हैं।

मैं क्या करता हूं "यह मेरी शाखा है, इसे अपने जोखिम पर उपयोग करें" को इंगित करने के लिए एक उपसर्ग का उपयोग करें, जैसे: एफसी-सामान्य-सफाई

+0

लेकिन फिर रिबेस के बाद आपको अलग-अलग शाखाओं की चेतावनी मिलती है, है ना? Http://superuser.com/q/667146/57249 देखें। क्या यह संभव है कि समाधान निजी शाखा के लिए 'गिट पुश - फोर्स' करना है? – Dror

+0

बेशक आपको विचलन के बारे में चेतावनी मिलती है, यही एक रिबेस होता है, और हां, आपको 'गिट पुश - फोर्स' करना होगा। – FelipeC

0

बल्कि सभी एक Git रेपो की फ़ाइलों को सिंक्रनाइज़ करने के लिए ड्रॉपबॉक्स पर भरोसा करने की बजाय, मैं नहीं बल्कि git bundle है, जो (आपकी सभी निजी शाखाएं शामिल हैं) केवल एक फ़ाइल पैदा करता है, और कहा कि ड्रॉपबॉक्स के साथ फ़ाइल सिंक का प्रयोग करेंगे ।
देखें "Git with Dropbox"

"Backup a Local Git Repository" में, Yars ड्रॉपबॉक्स के साथ सिंक में त्रुटियाँ होने का उल्लेख किया।