क्या सिम्पटिंग डॉटफाइल्स के बजाय git में $ HOME डालने के नुकसान हैं?


38

मेरे पास कई वर्षों से मेरी पूरी $HOMEनिर्देशिका में तोड़फोड़ की जाँच की गई थी। इसमें मेरे सभी डॉटफाइल्स और एप्लिकेशन प्रोफाइल, कई स्क्रिप्ट, टूल और हैक्स शामिल हैं, मेरी पसंदीदा बुनियादी होम डायरेक्टरी संरचना है, न कि कुछ ऑडबॉल प्रोजेक्ट और एक रैंडम डेटा का गोदाम। यह अच्छी बात थी। जबकि यह सिलसिला चला।

लेकिन यह हाथ से निकल गया। बुनियादी चेकआउट दर्जनों प्रणालियों में समान है, लेकिन यह सब मेरे सभी मशीनों के लिए उपयुक्त नहीं है। यह भी अलग distros के साथ सभी अच्छी तरह से नहीं खेलता है।

मैं घर की सफाई की प्रक्रिया में हूँ - डेटा को अलग करना जहाँ वह है, कुछ स्क्रिप्ट को अलग-अलग प्रोजेक्ट के रूप में विभाजित करना, सामान में कुछ टूटे हुए लिंक को ठीक करना जो स्वचालित होना चाहिए, आदि।

मेरा इरादा टॉपलेवल चेकआउट के subversionसाथ बदलने gitका है $HOME, लेकिन मैं इसे केवल उन चीजों को देना चाहता हूं, जो मैं अपने सभी सिस्टमों पर करना चाहता हूं, जिसका अर्थ है डॉटफाइल्स, कुछ निर्देशिकाएं और कुछ मूल कस्टम स्क्रिप्ट।

ऑनलाइन पढ़ने में बहुत सारे लोगों को सिमिलिंक दृष्टिकोण का उपयोग करते हुए ऐसा लगता है: एक उपनिर्देशिका में क्लोन तब $HOMEरिपॉजिटरी में से सिमिलिंक बनाते हैं । मेरे लिए किया था के बाद $HOMEएक दशक से अधिक पूर्ण संस्करण नियंत्रण में, मैं इस aproach के विचार पसंद नहीं है और मैं समझ नहीं क्यों लोग इतने सीधे चेकआउट पद्धति के खिलाफ लग रहे हैं। क्या मुझे gitशीर्ष स्तर के चेकआउट के लिए विशिष्ट के बारे में जानने की आवश्यकता है $HOME?

PS आंशिक रूप से अच्छे कोडिंग में एक अभ्यास के रूप में, मैं अपने रूट चेकआउट को github पर सार्वजनिक करने की योजना बना रहा हूं। यह डरावना है कि मैंने कितनी सुरक्षा संवेदनशील जानकारी को फ़ाइलों में इकट्ठा करने की अनुमति दी है जो कि एक दूसरे विचार के बिना श्रावक होने के लिए उपयुक्त है! वाईफाई पासवर्ड, संयुक्त राष्ट्र के पास-पास आरएसए कीज़ आदि, Eeek!


5
जिज्ञासु इस विश्वास का नेतृत्व करते हैं कि $ HOME को एक दूसरे विचार के बिना छोटा होना चाहिए। यहां तक ​​कि एन्क्रिप्टेड RSA निजी कुंजी भी साझा नहीं की जानी चाहिए।
व्युत्पन्न

3
यदि आप वास्तव में अपने घर निर्देशिका की सामग्री को गिट में डालने के बारे में बात कर रहे हैं, तो यह ध्यान दें: यह मुश्किल है (लेकिन असंभव नहीं है) गिट इतिहास के माध्यम से खुदाई करें और संवेदनशील वस्तुओं को सावधानीपूर्वक हटा दें (git को चीजों को खोने से रोकने में मदद करने के लिए डिज़ाइन किया गया है), और यह भी याद रखें कि जब आप शाखाओं को स्विच करते हैं या पहले के संशोधन gitको 644चेकआउट करते हैं, तो चेकआउट के बाद आपकी फ़ाइलों की अनुमतियों को बदल देंगे, जो निजी ssh कुंजी जैसी चीजों के लिए खराब है। हालाँकि etckeeper, के लिए git का उपयोग करने के लिए एक समाधान है / etc /
cwd

@derobert: मैं इससे अवगत हूं। मैं $ घर को सार्वजनिक करने के बारे में बात नहीं कर रहा था, बस dotfiles और सुविधा स्क्रिप्ट। वे हैं जहाँ मैं सामान है कि संबंधित नहीं है मिल गया है। और हाँ, मैं अपने साझा करने के लिए सक्षम होना चाहिए .zshrc, .vimrcऔर उन्हें पहले को साफ़ करने में बिना इसी तरह की बातों!
कालेब

4
यदि आपने इसे नहीं देखा है, तो vcs-home विकी और मेलिंग सूचियों को देखें, जो मूल रूप से लोग इस पर चर्चा कर रहे हैं - संशोधन के नियंत्रण में अपने $ HOME को कैसे रखें।
पेरिस में जिम पेरिस

मुझे नहीं पता कि आप git के व्यवहार को कितना बदल सकते हैं, लेकिन कम से कम जिस तरह से यह आउट-ऑफ-द-डेबियन-रिपॉजिटरी काम करता है, यह ट्रैक किए गए / अनट्रैक / संशोधित फ़ाइलों की खोज के लिए काफी लालची है और यह स्वचालित रूप से हर फाइल के लिए जिम्मेदार लगता है। mrb ने पहले ही यह कहा था। कभी-कभी मैं इस छोटी सी परियोजना में भी इस लालची व्यवहार से परेशान हो जाता हूं जो मैं अपने घर की निर्देशिका में नहीं चाहता। Git का उपयोग क्यों करना चाहते हैं? मैं होस्ट्स में अपनी कॉन्फ़िगरेशन फ़ाइलों को सिंक करने के लिए एक वर्जनिंग सिस्टम का भी उपयोग कर रहा हूं और मैं सीवीएस से काफी खुश हूं क्योंकि यह बहुत सरल है! इसके लिए Git बहुत (बहुत!) शक्तिशाली है
बनगुनिन

जवाबों:


17

हां , gitघर की निर्देशिका का प्रबंधन करने पर विचार करते समय कम से कम एक बड़ी गड़बड़ी होती है, जिसके साथ कोई चिंता नहीं है subversion

Git डिफ़ॉल्ट रूप से लालची और पुनरावर्ती दोनों है

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

जैसा कि यह पता चला है, यह मुख्य कारण है कि लोग अपने डॉटफ़ाइल्स को एक अलग फ़ोल्डर में चेकआउट करते हैं और फिर उसमें सिम्लिंक करते हैं। यह आपके किसी भी बच्चे की निर्देशिका में कुछ और करते समय रास्ते से बाहर रखता है $HOME। जबकि यह विशुद्ध रूप से वरीयता का मामला है यदि आपके घर को तोड़फोड़ की जाँच करें, तो गिट का उपयोग करना आवश्यक हो जाता है।

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

इस चाल को थोड़ा चिकना बनाने के लिए, वहाँ कुछ बेहतरीन उपकरण हैं। VCS-घर मेलिंग सूची वास्तविक जगह की तरह शुरू करने के लिए लगता है, और पृष्ठ के बारे में howtos और लोगों के अनुभवों के ऊपर एक सुविधाजनक चादर है। जिस तरह से vcsh , mr जैसे कुछ छोटे उपकरण हैं । अगर आप अपने होम डायरेक्टरी को सीधे git में रखना चाहते हैं, तो vcsh के पास टूल होना चाहिए। आप पर्दे के पीछे कई repostories में विभाजित आपकी होम निर्देशिका खत्म करते हैं, तो गठबंधन vcshके साथ mrत्वरित और नहीं बहुत गंदे जिस तरह से यह सब एक बार में प्रबंधन करने के लिए के लिए।


2
लेकिन सिर्फ अपनी * .ignignore फ़ाइल में '*' क्यों न जोड़ें? इस तरह git फ़ाइलों को छोड़कर सब कुछ अनदेखा कर देगा जो पहले से ही भंडार में हैं, और आप नई फ़ाइलों को जोड़ सकते हैं git add -f <file>
एएलआईएक्स

@ALiX: क्योंकि gitउपकरण अभी भी आपको अपने घर के डीआईआर रेपो पर काम करने पर विचार करेंगे, भले ही आप कुछ उपनिर्देशिका में हों जो किसी परियोजना के लिए एक अलग गिट रेपो था। वह समाधान आपके संपूर्ण होम डायरेक्टरी को अन्य सभी git कार्य की सीमा से बाहर कर देगा।
कालेब

5
लेकिन आपके .gitignore में एक '*' का अर्थ है कि आपके घर-डीआईआर रेपो में मौजूद सभी फाइलों को नजरअंदाज नहीं किया जाता है। और जब आप कुछ उपनिर्देशिका में एक नए git रेपो की जांच करते हैं, तो सब कुछ अभी भी उम्मीद के मुताबिक काम करना चाहिए (मुझे लगता है)। जहां तक ​​मुझे पता है, डायरेक्टरी पदानुक्रम को आगे बढ़ाते हुए git टूल पहली .git डायरेक्टरी की तलाश करेंगे। इसलिए, उपनिर्देशिका में काम करते समय, सही गिट रिपॉजिटरी का उपयोग किया जाएगा। बेशक, अगर आप git के पर्यावरण चर का उपयोग कर रहे हैं, तो मुझे लगता है कि चीजें गड़बड़ हो सकती हैं। लेकिन अन्यथा, मैं यह नहीं देखता कि यह काम क्यों नहीं करेगा।
ALXX

@ALiX सही है। Nied git repos तब तक ठीक काम करते दिखाई देते हैं जब तक कि आप उन्हें जनक repo में gitignore करते हैं। मुझे आश्चर्य है कि जीआईटी के पर्यावरण चर के साथ संभावित समस्याओं से अलग इस सरल दृष्टिकोण की कमियां क्या हैं।
इवानमर्फी

1
आज इसके साथ प्रयोग कर रहे हैं। मुझे लगता /*है *कि यह बेहतर काम करता है क्योंकि यह अभी भी डिफ़ॉल्ट रूप से सब कुछ अनदेखा करता है लेकिन निर्देशिकाओं को जोड़ना बहुत आसान बनाता है। इसके बजाय git add -fमैं !-प्रभारी पैटर्न का उपयोग कर रहा हूं जैसे !/.vimrcऔर !/.gitignore( .ignignore फ़ाइल के लिए) स्पष्ट रूप से रेपो में चीजों को शामिल करना।
evanrmurphy

14

मैं नहीं चाहूंगा कि मेरी पूरी होम डायरेक्टरी सिर्फ वर्जन कंट्रोल में चेक की जाए क्योंकि इसका मतलब है कि मैं जिस भी उपनिर्देशिका में जाऊंगा, उसमें मेरे होम वार का वर्जन-कंट्रोल संदर्भ होगा। git checkoutउस मामले में एक वास्तविक कार्रवाई होगी जैसे कि अगर मैं गलती से गलत निर्देशिका से कुछ चलाता हूं, तो यह समस्या है, चाहे वह कुछ भी gitहो या एक स्क्रिप्ट जो गिट बुलाती है।

यह रेपो में कुछ ऐसा जोड़ने की भी संभावना रखता है जो आप नहीं चाहते हैं, जो कि एक ऐसा मुद्दा नहीं होगा जब आपने सब कुछ चेक किया हो, लेकिन अब यह एक समस्या बन गई है। क्या होगा यदि आप गलती से एक निजी कुंजी फ़ाइल (शायद आदत से बाहर) जोड़ते हैं और इसे जीथब पर धक्का देते हैं?

यह कहने के बाद, मुझे लगता है कि प्राथमिक नुकसान वास्तव में तकनीकी नहीं हैं - बस मुझे खुद से बचाना चाहते हैं।

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

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

कुछ इस तरह:

HOMEREPO=$HOME/homerepo
HOST=$(hostname)
UNAME=$(uname)

for dotfile in $HOMEREPO/shared/* $HOMEREPO/host-$HOST/* $HOMEREPO/uname-$UNAME/*
do
    target=$HOME/$(basename $dotfile)
    [ ! -r $target ] && ln -s $dotfile $target
done

व्यक्तिगत रूप से: मैं सिमिलिंक का उपयोग करता हूं, और मैं निर्देशिकाओं को सहानुभूति नहीं देता; केवल फाइलों के भीतर। यह मुझे उन निर्देशिकाओं में साइट-स्थानीय परिवर्तन करने के लिए कुछ लचीलापन देता है (जैसे। फाइलें जोड़ना / हटाना)। एक नई प्रणाली पर अपना खाता सेट करना थकाऊ है क्योंकि मुझे हाथ से सभी सिम्बल को फिर से बनाना है।


gitमेरे द्वारा चलाए जाने वाले कोई भी आदेश या तो होम निर्देशिका के लिए ही होंगे या कम से कम एक एनओएन कमिटेड डायरेक्टरी में गहरे दफन किए जाएंगे। svnइस एक फ़ोल्डर अलगाव का उपयोग करना काफी प्रभावी है और इससे मुझे एक दशक में कोई परेशानी नहीं हुई है। आपका पहला पैराग्राफ कुछ और इंगित करता है। क्या यह वास्तव में gitकाम करने के तरीके में अंतर है ?
कालेब

इसके अलावा मेरे कॉन्फिगरेशन और स्क्रिप्ट में अलग-अलग होस्ट और प्लेटफॉर्म के लिए पहले से ही सशर्त तर्क होते हैं, इसलिए स्क्रिप्ट को अलग-अलग लिंक सेटअप करने के लिए इस्तेमाल करना क्योंकि सशर्त gitशाखाएं बनाना आसान नहीं है। अभी भी कुछ मुझे याद आ रहा है या यह वरीयता के लिए नीचे आने वाला है?
कालेब

3
एक-फ़ोल्डर अलगाव वास्तव में अलग-थलग gitनहीं है svn- के बारे में निश्चित नहीं है - लेकिन एक उदाहरण के लिए, git init foo && mkdir -p foo/bar/baz/spam && cd foo/bar/baz/spam && git status(या अन्य गिट आदेश) से पता चलता है कि आप अभी भी fooसंस्करण नियंत्रण संदर्भ में हैं।
mrb

कॉन्फिग्स और स्क्रिप्ट्स: सभी डॉटफाइल्स सशर्त समर्थन नहीं करते हैं, यही वजह है कि मैंने वैकल्पिक दृष्टिकोण का सुझाव दिया। ये सभी कारण हैं जो मुझे लगता है कि लोग इसके लिए संस्करण नियंत्रण का उपयोग नहीं करना पसंद करते हैं $HOME- और संस्करणांकन वास्तव में डॉटफ़ाइल्स इमो के लिए मूल्यवान नहीं है - लेकिन अंततः यह आपके घर की निर्देशिका है, इसलिए यदि आप गिट का उपयोग करना पसंद करते हैं और ये आपके लिए समस्याएं नहीं हैं, तो इसके लिए जाओ!
mrb

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

6

एक और दृष्टिकोण देने के लिए: मेरे पास कुछ समय के बाद से मेरा घर गृहस्थी का काम कर रहा है और इसमें कोई कमियां नहीं हैं। मैं स्पष्ट रूप से इस git रेपो को github में सिंक नहीं करता हूं; मैं एक ऐसी सेवा का उपयोग करता हूं जिसमें निजी प्रतिनिधि हैं। मैं गिट कंट्रोल के तहत कोई मीडिया फाइल या डाउनलोड या पैकेज भी नहीं डालता।

  • git status चेकलिस्ट को "साफ करने के लिए" का एक प्रकार है।

  • मेरे पास ~/tmpअस्थायी चीजों के लिए है, जो कि gitignored है।

  • मैं git statusकुछ भी देखना पसंद करता हूं जो हाल ही में स्थापित सॉफ़्टवेयर मेरे $ HOME में जोड़ने की हिम्मत करता है, और अक्सर इन फ़ाइलों को हटा देता है, या यहां तक ​​कि दोषियों की स्थापना रद्द करता है।

  • मैं मैन्युअल रूप से वास्तव में उपयोगी स्थानीय फ़ाइलों को जोड़ता हूं और .gitignoreउन चीजों के लिए dirs करता हूं, जिनमें 'पता है कि आप चीजों को स्थापित करते समय क्या करते हैं'।

  • यदि मैं एक नया VM बनाता हूं या एक नया पीसी स्थापित करता हूं, तो मैं अपने दूरस्थ घर को $ HOME में क्लोन कर सकता हूं और तुरंत ही वह सब कुछ होगा जो मुझे हाथों में चाहिए।

  • Vim plugins के लिए vundle जैसी चीजें अब आवश्यक नहीं हैं।

मुझे जटिलता पसंद है। जब मैं किसी भी rcfile को ट्विक करता हूं, तो मैं इसे करता हूं, कमिट करता हूं और पुश करता हूं। फिर, एक पलटा के रूप में, मैं हर दूसरे दिन $ HOME में खींचता हूं, और हमेशा नवीनतम कॉन्फिगर करता हूं। यह इतना आसान है।

वर्तमान में इस रिजीम के तहत मशीनें: होम लैपटॉप, वर्क पीसी, वर्क वीएम, प्लस 3 या 4 रिमोट सर्वर।


क्या आपके घर के अंदर कोई अन्य गिट चेकआउट है?
कालेब

नहीं, मैं अन्य चीजों को एक / वर्क डायरेक्टरी में रखता हूं और विम पगिन्स जैसे छोटे टूल्स को क्लोन नहीं करता हूं।
जी.बी.

1
मेरे पास एक ~ / साइट के अंदर काम है और इस दृष्टिकोण को भी करते हैं, नेस्टेड git रेपो के साथ कोई समस्या नहीं है
फिल्पेरो

1
मैं थोड़ी देर के लिए इस सेटअप का उपयोग कर रहा हूं। मेरे पास एक 'उर्फ वर्ग = git स्टेटस -uno' है और .gitignore के साथ ज्यादा परेशान नहीं करते हैं (हर बार मैं सभी cruft पर एक नज़र डालता हूं और फिर "meh" कहता हूं)। मैं नेस्टेड git repos के साथ कभी भी समस्या नहीं थी। मेरे पास एक निजी सर्वर है जहां मैंने किया था git init --bareकि मैं ओवरशर्ट पर पुश करूं (हालांकि मैंने रेपो में पासवर्ड नहीं डाला, मेरे पास वहां मेरे नोट्स फाइलें हैं)।
अनहमर

5

मैंने दोनों की कोशिश की है, और अंत में सिमिलिंक दृष्टिकोण को प्राथमिकता दी है :

  • जहां भी जांच हो
  • make install
  • X सेटिंग्स लोड करने के लिए फिर से लॉग आउट करें

नुकसान:

  • उन्हें जोड़ने से पहले रेपो में फ़ाइलों को स्थानांतरित करना होगा
  • मेकफाइल में प्रतीकात्मक लिंक की सूची को बनाए रखना है

लाभ:

  • बड़े पैमाने पर ज़रूरत नहीं है .gitignore( ~मेरे विनम्र उबंटू बॉक्स पर 133 डॉटफाइल्स हैं )
  • कर सकते हैं रखरखाव स्क्रिप्ट रखने और अन्य ~संबंधित सामान (जैसे Makefileऔर cleanup.sh) रास्ते से बाहर
  • संस्करण व्यक्तिगत और सार्वजनिक सेटिंग्स को अलग से नियंत्रित कर सकता है

प्रतिबंध:

  • @Mrb के विपरीत, मैं केवल सहानुभूति पैदा करता हूं ~। यह सहानुभूति को सरल रखता है, और ~/.vimकुछ बहुत ही दुर्लभ .gitignoreरखरखाव की कीमत पर, उदाहरण के लिए नई फ़ाइलों को नोटिस करना तुच्छ बनाता है ।

पिछले दो फायदों ने मेरे मामले में तराजू को उलझा दिया - मैं घर की निर्देशिका को अव्यवस्थित नहीं करना चाहता, और मैं निजी और सार्वजनिक सामग्री को स्पष्ट रूप से अलग रखना चाहता हूं।

एकमात्र एप्लिकेशन जिसके बारे में मुझे पता है कि (या कम से कम) सहानुभूति को संभालने के साथ समस्याएं थीं पिजिन - यह साधारण फ़ाइलों के साथ मेरी सहानुभूति को अधिलेखित करता रहा।


प्रत्येक दृष्टिकोण के समर्थक और विपक्ष पर आपके इनपुट के लिए धन्यवाद। मेरे अनुसरण में मुझे पता चला है कि एक तीसरा aproach है जो दोनों दुनिया के सर्वश्रेष्ठ बना सकता है यदि आप शुरू करने के लिए अतिरिक्त वायरिंग स्थापित कर रहे हैं।
कालेब

3

यहाँ एक है: यदि आप करने की कोशिश करते हैं git rebase -i --rootऔर आपने .gitconfigरिपॉजिटरी में पहले कमिट में चेक किया है, तो git .gitconfigफाइल को अस्थायी रूप से हटा देगा , जो बदले में इसे रिबेस ऑपरेशन को पूरा करने में असमर्थ बना देगा क्योंकि इसे आपके नाम और आपके ईमेल की आवश्यकता है जो, उस फ़ाइल में संग्रहीत हैं।

आप उन्हें फिर से कॉन्फ़िगर कर सकते हैं और कर सकते हैं git rebase --continue, लेकिन जब मैंने ऐसा किया था और रिबेस ऑपरेशन समाप्त कर दिया था, तो मेरे गिट रिपॉजिटरी ने कमिट मैसेज के बिना एक खाली कमिट प्राप्त किया था, जो उस कमिट से पहले रिपॉजिटरी में पहला कमिट था, जिसे मैं नहीं जानता। कैसे छुटकारा पाएं।

मुझे नहीं पता कि क्या होता है अगर आप इसके git rebase -i <commit>बजाय करते हैं, और .gitconfigबाद में किसी भी प्रतिबद्ध के साथ मिलकर जांच की जाती है <commit>

शायद सबसे आसान उपाय .gitconfigरिपॉजिटरी से जोड़ने से बचना है और इसके बजाय इसे सूचीबद्ध करना है .gitignore


2

यह मेरा इसे करने का तरीका है:

  1. एक साफ लाइन स्थापित करें (आवश्यक नहीं, लेकिन चरण 4 में जीवन को अधिक सुखद बनाता है)
  2. एटकीपर स्थापित करें
  3. चलाने के git initअपने घर में
  4. .gitignore बनाएं और ऐसा सब कुछ जोड़ें जो ऐसा लगे कि इसमें आपकी रुचि नहीं है या जो बहुत कुछ बदल सकता है। आदि चीजों को जोड़ना सुनिश्चित करें *.cache, *.lockमैं जोड़ने की सलाह नहीं देता/*जब आपके घर में कुछ नया जोड़ा जाता है तो आपको स्वचालित रूप से सूचित नहीं किया जाएगा। यह एक श्वेत सूची दृष्टिकोण बनाम श्वेतसूची दृष्टिकोण है, जहां मैं मूल रूप से अस्थिर सॉफ़्टवेयर को छोड़कर सभी सॉफ़्टवेयर के लिए अपना कॉन्फ़िगर रखना चाहता हूं और कुछ सॉफ़्टवेयर जिनकी मुझे परवाह नहीं है। जब आप बाद में विलय करते हैं, तो सिस्टम को माइग्रेट करें या तुलना करें, सब कुछ अलग करने में सक्षम होना काफी आसान है। आप अपने नए सिस्टम को बहुत तेजी से सेट कर सकते हैं अगर आपके पास सिर्फ .bashrc और कुछ अन्य dotfiles संग्रहीत हैं। इस तरह आप कॉन्फ़िगरेशन को रखेंगे जो आप अन्यथा GUI के माध्यम से सेट कर सकते हैं, और इस बात से अनजान होंगे कि कौन सी डॉटफ़ाइल्स सेटिंग्स को स्टोर करती हैं। (अगर यह कभी पता चला है कि आपने अस्थिर फाइलें बनाई हैं, तो आप अभी भी मान-अपरिवर्तित होने की बात कह सकते हैं)
  5. रन etckeeper init -d /home/username
  6. रन git commit -d /home/username
  7. अपने शेल में एलियासेस सेट करें ताकि कमांड लाइन को अच्छा बनाया जा सके, जैसे homekeeper checkout

एटकीपर का उपयोग करने का कारण यह है कि यह मेटाडेटा को आपकी फ़ाइलों के लिए अनुमतियों की तरह संग्रहित करेगा (बल्कि ssh कीज़ जैसी कुछ चीज़ों के लिए महत्वपूर्ण)। अब आपके पास प्री-कमिट हुक होना चाहिए जो मेटाडेटा को स्वचालित रूप से बचाएगा। मैं पोस्ट-चेकआउट के बारे में इतना निश्चित नहीं हूं। आपको शायद इसका उपयोग करना चाहिए etckeeper checkout xxx -d /home/userमैं इसे थोड़ा और अधिक देखूंगा और इस उत्तर को विस्तृत करूंगा।


-1

घर निर्देशिका पर गिट का उपयोग करने के साथ मेरी प्रमुख समस्या यह है कि गिट फ़ाइल की अनुमति और टाइमस्टैम्प जैसी फ़ाइल विशेषताओं को संग्रहीत नहीं करता है। मेरे लिए यह जानना महत्वपूर्ण है कि कुछ फाइलें कब बनाई गईं, जो आपके लिए हो सकती हैं या नहीं। इसके अलावा, फ़ाइलों और निर्देशिकाओं के लिए अनुमतियाँ खोना .sshसमस्याग्रस्त है। मैं समझता हूं कि आप .sshGit से बाहर रखने की योजना बना रहे हैं , लेकिन ऐसी अन्य जगहें भी होंगी जहाँ अनुमतियाँ मायने रखती हैं (जैसे कि असम्पीडित वेबसाइट बैकअप)।


यह भ्रामक है यदि तथ्यात्मक रूप से गलत नहीं है। डिफ़ॉल्ट रूप से Git अनुमतियों सहित कई फ़ाइल विशेषताओं को संरक्षित करता है। मैं .sshकुछ समय के लिए बिना किसी समस्या के जीआईटी में रख रहा हूं , उचित सुरक्षित अनुमतियाँ संरक्षित हैं। आधार कॉन्फ़िगरेशन में यह क्या नहीं करता है स्वामित्व या टाइमस्टैम्प को संरक्षित करना; फिर भी यदि इनमें से कोई एक विशिष्ट उपयोग के मामले के लिए एक समस्या है, तो ऐसे प्लगइन्स हैं जो इन अतिरिक्त गुणों को नियमित वर्कफ़्लो का हिस्सा बना सकते हैं (मेटास्टोर या गिट-कैश-मेटा देखें)।
कालेब

यहां तक ​​कि अगर यह उन्हें संग्रहीत नहीं करता है, तो यह कैसे होता है कि घर निर्देशिका होने से भी बदतर कोई vcs में नहीं है? जब तक आप इसे फ़ाइल को बदलने के लिए नहीं कहते हैं, git सक्रिय रूप से mtimes को अधिलेखित करने वाला नहीं है।
पूल

-1

एक गिट आधारित समाधान विशेष रूप से उपयोगी है यदि आपको अपनी फ़ाइलों को विभिन्न मशीनों पर तैनात करने की आवश्यकता है, और इससे भी अधिक यदि आपके पास ऐसे भाग हैं जो सभी मशीनों के लिए सामान्य हैं, और कुछ मशीनों के लिए विशिष्ट भागों। आप एक से अधिक रिपॉजिटरी बना सकते हैं और उन्हें एक ही डायरेक्टरी (इस मामले में आपका होम डायर) पर क्लोन करने के लिए मल्टीजेट या vcsh जैसे टूल का उपयोग कर सकते हैं ।


धन्यवाद, लेकिन शायद आप सवाल चूक गए। मैं इसके लिए उपयोग के बारे में अच्छी तरह से जानता हूं (इसलिए मैं इसे पहली जगह में क्यों करना चाहता था), यह सवाल किसी भी नुकसान के बारे में था जो किसी के लिए इसे करने के लिए नया था (जैसा कि मैंने तब पूछा था) जब आपको पता नहीं होगा । यह उस प्रश्न का उत्तर नहीं देता है।
कालेब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.