2010-02-12 7 views
5

मेरे पास एक रिपोजिटरी है जिसमें मैं काम करता हूं। वहां एक फ़ोल्डर है जहां मैंने उन सभी सामानों को रखा है जिन्हें मैं स्रोत खोलना चाहता हूं, इसलिए यह निजी भागों से अलग है। क्या उस फ़ोल्डर में किए गए किसी भी चीज को गिटब रिपोजिटरी में स्वचालित रूप से गिट प्राप्त करने का कोई तरीका है, बिना मुझे हर बार नई बदली गई फ़ाइलों को धक्का देना याद रखना? मैं पूरे भंडार को किसी अन्य जिथब स्थान पर धक्का देना चाहता हूं।गिटब में एक गिट भंडार में एक फ़ोल्डर में स्वत: पुश परिवर्तन?

उत्तर

8

यदि आपके पास एक ही भंडार है जहां भागों का सार्वजनिक होना है और भागों को निजी होने का इरादा है, तो आपको मूल रूप से अपने भंडार सेटअप में कुछ बदलना होगा। गिट पूरी रिपोजिटरी ट्रैक करता है, ताकि आप या तो सार्वजनिक या निजी भंडार कर सकें, लेकिन आंशिक रूप से यह और आंशिक रूप से नहीं।

यदि आपके पास "सार्वजनिक" फ़ाइलों और "निजी" फ़ाइलों के साथ एक रेपो दोनों के साथ एक रेपो है, तो आप स्वचालित रूप से काम करने के लिए "सार्वजनिक" रेपो में एक गिट हुक जोड़ सकते हैं, और केवल निजी रेपो निजी रखें ।

हालांकि, अगर आप लिख रहे हैं आप दोनों "सार्वजनिक" और "निजी" फ़ाइलों से युक्त एक भी रेपो है, तो आप विभाजित करने के लिए है कि कुछ "सार्वजनिक" और कुछ "किसी तरह से निजी में जरूरत है कि।

आप इस स्थितियों को हल करने के लिए विकल्पों की एक संख्या है:। अपने स्वयं के भंडार में बाहर "सार्वजनिक" फ़ोल्डर

  1. स्प्लिट जो आप GitHub करने के लिए धक्का होगा यह "सार्वजनिक" एक छोटे से फ़ोल्डर के इतिहास को फिर से लिखने होंगे। मैं इसे नीचे अधिक विस्तार से रूपरेखा दूंगा।

  2. ऐसी शाखा बनाएं जो केवल "सार्वजनिक" फ़ोल्डर, से संबंधित है और केवल उस शाखा को प्रकाशित करें। यह "गलती से धक्का, यानी प्रकाशित, निजी सामान" भावना, में खतरनाक है और अगर आपके पास है तो कोई भी ऐसा काम करता है जो "सार्वजनिक" और "निजी" फ़ाइलों को स्पर्श करता है, इसलिए मैं चाहता हूं इस विकल्प के खिलाफ सलाह देते हैं, और इसके बारे में और अधिक नहीं लिखेंगे।

बंटवारे बंद अपने स्वयं के भंडार में "सार्वजनिक" फ़ोल्डर के लिए, अपने "संयुक्त" शाखा बंद एक नया "सार्वजनिक" शाखा बनाने के लिए, और उस पर git filter-branch का उपयोग नए "सार्वजनिक" शाखा केवल सामान शामिल हो "सार्वजनिक" फ़ोल्डर से। "उदाहरण" खंड केवल सही - subdirectory-filter उदाहरण दिखाता है)। फिर आपके पास पुरानी "संयुक्त" शाखा दोनों "सार्वजनिक" फ़ोल्डर और इसमें निजी सामान, और नई "सार्वजनिक" शाखा केवल "सार्वजनिक" फ़ोल्डर के साथ होगी।

ध्यान रखें कि उदा। नई "सार्वजनिक" शाखा में प्रतिबद्ध संदेश में अभी भी "निजी" जानकारी हो सकती है। तो आपको सभी प्रतिबद्ध संदेशों के माध्यम से जाना चाहिए, उन्हें निजी जानकारी के लिए स्कैन करना चाहिए, और संभावित रूप से उस निजी जानकारी को फिर से बाहर करना चाहिए, उदा। git rebase -i के साथ।

अद्यतन: [केवल "सार्वजनिक" शाखा और कुछ नहीं शायद किसी भी अन्य जानकारी स्थानांतरण नहीं होगा, तो यह रेपो सफाई के बाद धक्का शायद जरूरत नहीं है।] क्या आप कोई भी कार्य करने के लिए आवश्यक हैं रेडियोधर्मी, आप git gc (शायद --prune=0 और --aggressive विकल्पों के साथ रेपो से पुरानी अपरिवर्तित संशोधनों को हटाना चाहते हैं - लेकिन मुझे इसके बारे में अधिक जानकारी के साथ SO उत्तर नहीं मिल रहा है)।

अब आपकी "सार्वजनिक" शाखा प्रकाशन के लिए तैयार है। यह सुनिश्चित करने के लिए कि इसमें केवल "सार्वजनिक" जानकारी है, आप इसे एक नए खाली स्थानीय नंगे रेपो में डाल सकते हैं, इसकी सभी सामग्री को सत्यापित करने के लिए इसकी सभी सामग्री की जांच करें। संतुष्ट होने के बाद, आप "सार्वजनिक" शाखा को जिथब पर एक नए खाली रेपो पर धक्का दे सकते हैं। गिथब पर रेपो में केवल "सार्वजनिक" शाखा होगी, जिसे आपको शायद जिथब रेपो पर "मास्टर" नाम देना चाहिए।

"संयुक्त" शाखा के साथ आपके स्थानीय रेपो में अभी भी सार्वजनिक और निजी जानकारी दोनों शामिल हैं, और नए "सार्वजनिक" जिथब रेपो से कोई संबंध नहीं है।

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

यदि आपकी निजी और आपकी सार्वजनिक फाइलों के बीच एकीकरण बहुत तंग और संस्करण निर्भर है, तो आप अपने निजी रेपो में "सार्वजनिक" रेपो का एक विशिष्ट संस्करण जोड़ने के लिए git submodule का उपयोग कर सकते हैं। पूर्व "सार्वजनिक" फ़ोल्डर की तरह नामित एक नया सबमिशन फ़ोल्डर आपके निजी सामान में परिवर्तन को कम करेगा, क्योंकि सभी "सार्वजनिक" फ़ाइलें उनके पुराने पथ में होंगी। ध्यान दें कि गिटूब पर कुछ धक्का दिया गया है जब सबमिशन फ़ोल्डर स्वचालित रूप से अपडेट नहीं होगा। आप अपने स्थानीय सबमिशन फ़ोल्डर में गिट हुक जोड़कर उस पर काम कर सकते हैं जो "संयुक्त" रेपो में सबमिशन जानकारी अपडेट करेगा।

यदि आपकी निजी और आपकी सार्वजनिक फ़ाइलों के बीच एकीकरण अधिक ढीला है, तो आप सार्वजनिक फ़ाइलों को किसी भी बाहरी तृतीय-पक्ष प्रोजेक्ट की तरह भी इलाज कर सकते हैं और इसे किसी भी अन्य व्यक्ति को एकीकृत करने के तरीके में अपनी निजी सामग्री में एकीकृत कर सकते हैं, यानी सॉफ्टवेयर का कोई बाहरी टुकड़ा आपका "निजी" सॉफ्टवेयर इस पर निर्भर करता है।

+0

पोस्ट करें हां, सार्वजनिक और निजी सामान के बीच कड़े एकीकरण इसलिए मैं उन्हें एक रेपो में रखना चाहता था। जब मैं निजी सामानों पर काम करता हूं तो सार्वजनिक सामान ज्यादातर बदल जाता है, इसलिए मैं खींचना नहीं चाहता हूं। साथ ही, मैं निजी रेपो की स्थिति को टैग करने में सक्षम होना चाहता हूं, और सार्वजनिक सामान के वर्तमान संस्करण को शामिल करना चाहता हूं। – uliwitness

+0

गिट submodules submodule के कामों के एसएचए रिकॉर्ड। यदि आप निजी रेपो टैग करते हैं, तो उस टैग में सभी submodules 'SHA को शामिल किया जाएगा। तो आप वांछित तंग युग्मन प्राप्त कर सकते हैं। – ndim

0

प्रतिबद्धता पर दबाव डालने के लिए githook का उपयोग करें।

+0

क्या वह पूरे भंडार को धक्का नहीं देगा? मैं उस फ़ोल्डर और उसकी सामग्री को वहां से कैसे निकाला जा सकता हूं? – uliwitness

+0

फ़ोल्डर को सबमिशन करें, पुश – databyte

संबंधित मुद्दे