स्रोत नियंत्रण के तहत ~ लगाने के लिए टिप्स


77

मैं अपनी होम डायरेक्टरी (~) को सोर्स कंट्रोल (git, इस मामले में) के तहत रखना चाहता हूं, क्योंकि मेरे पास कई सेटिंग फाइलें हैं (। .conconfig, .itignore, .emacs, आदि), जिनमें मैं मशीनों को ले जाना चाहता हूं। और उन्हें Git में रखने से उन्हें पुनः प्राप्त करना अच्छा होगा।

मेरी मुख्य मशीन मेरा मैकबुक है, और जिस तरह से ओएस एक्स की स्थापना की गई है, कई फ़ोल्डर्स हैं जिन्हें मैं अनदेखा करना चाहता हूं (दस्तावेज़, डाउनलोड, .ssh)। ऐसे फ़ोल्डर भी हैं जो पहले से ही Git (.emacs.d) का उपयोग कर रहे हैं।

मेरा विचार था कि इन सभी निर्देशिकाओं को मेरी .gitignore फ़ाइल में जोड़ दिया जाए, लेकिन यह एक प्रकार का थकाऊ है, और संभवतः कुछ अप्रत्याशित परिणाम पैदा कर सकता है। मेरा अगला विचार समय-समय पर उन फ़ाइलों को कॉपी करना था, जिन्हें मैं घर में कुछ फ़ोल्डर में संग्रहीत करना चाहता हूं, फिर उस फ़ोल्डर को कमिट करें। इसके साथ समस्या यह होगी कि मुझे कमिट करने से पहले उन्हें याद रखना होगा।

क्या ऐसा करने का एक साफ तरीका है?


आप एक स्क्रिप्ट भी बना सकते हैं जो आप चाहते हैं और इसे क्रोनॉजर के माध्यम से कॉल करने वाले फ़ोल्डर के कमिट कर रहे हैं।
शादोक

ध्यान दें कि मैक ओएस एक्स पर डिफ़ॉल्ट एचएफएस + फ़ाइल सिस्टम केस-असंवेदनशील (लेकिन केस-संरक्षण) है और उस फ़ाइल पथ को उपयोगकर्ता स्थान में कैनोनिक रूप से विघटित UTF-8 में एन्कोड किया गया है! अधिक जानकारी के लिए देखें: <a href=" stackoverflow.com/questions/5581857/… और Mac OS X<

जवाबों:


60

मेरे पास $HOMEगिट है। मेरी .gitignore फ़ाइल की पहली पंक्ति है

/*

बाकी !मॉडिफायर का उपयोग न करने के लिए पैटर्न हैं । इस पहली पंक्ति का मतलब है कि डिफ़ॉल्ट मेरे घर निर्देशिका में सभी फ़ाइलों को अनदेखा करना है। वे फाइलें जिन्हें मैं संस्करण नियंत्रण में लाना चाहता हूं .gitignore, वे इस तरह से जाती हैं:

!/.gitignore
!/.profile
[...]

एक पेचीदा पैटर्न मेरे पास है:

!/.ssh
/.ssh/*
!/.ssh/config

यही है, मैं केवल संस्करण .ssh/configबनाना चाहता हूं - मैं अपनी कुंजी और अन्य फ़ाइलों को git में जाने के लिए नहीं चाहता हूं। उपरोक्त है कि मैं इसे कैसे हासिल करूं।

संपादित करें: सभी रास्तों की शुरुआत करने के लिए स्लैश जोड़े गए। यह कहीं भी के बजाय रिपॉजिटरी ($ HOME) के शीर्ष से अनदेखा पैटर्न मैच करता है। उदाहरण के लिए, यदि !lib/एक पैटर्न था (लिबास डायरेक्टरी में सब कुछ अनदेखा न करें) और आप एक फाइल जोड़ते हैं .gitignore, पहले वाला पैटर्न ( !.gitignore) मेल कर रहा था। अग्रणी स्लैश ( !/.gitignore) के साथ, यह केवल .gitignoreमेरे होम डायरेक्टरी में मेल खाएगा और किसी भी उपनिर्देशिका में नहीं।

मैंने ऐसा कोई मामला नहीं देखा है जहाँ यह मेरी अनदेखी सूची के साथ व्यावहारिक अंतर बनाता है, लेकिन यह मुझे तकनीकी रूप से सटीक प्रतीत होता है।


1
यह मुझे लगता है कि इसे बहुत आसान तरीके से हासिल किया जा सकता है ।
निक वोल्किन

24

मैं (समान उद्देश्यों के साथ) अपनी कॉन्फ़िगरेशन फ़ाइलों को एक उपनिर्देशिका में रखता हूं ~/libऔर मेरे घर की निर्देशिका में प्रतीकात्मक लिंक हैं, जैसे .emacs -> lib/emacs/dot.emacs। मैं केवल कॉन्फ़िगरेशन फ़ाइलों को रखता हूं जो मैंने संस्करण नियंत्रण के तहत स्पष्ट रूप से लिखा था; मेरे घर की निर्देशिका में स्वचालित रूप से निर्मित डॉट फाइलें हैं जो संस्करण नियंत्रण में नहीं हैं। इस प्रकार ~/libसंस्करण नियंत्रण में है, और मेरी होम निर्देशिका नहीं है।

मेरे पास एक स्क्रिप्ट है जो फाइलों के नीचे से प्रतीकात्मक लिंक बनाता है ~/lib। जब मैं एक नई मशीन पर एक खाता बनाता हूं, तो मैं ~/libउस स्क्रिप्ट की जांच करके और उसे चलाकर पॉपुलेट करता हूं ।

मेरा अनुभव सीवीएस के साथ है, गिट नहीं, इसलिए यह 100% हस्तांतरणीय नहीं है। सीवीएस के तहत मैंने अपने होम डायरेक्टरी को सीधे नहीं रखा है, इसका एक कारण यह है कि ~/.cvsignoreमेरे सभी सीवीएस चेकआउट और केवल मेरे होम डायरेक्टरी पर लागू नहीं होंगे; git में यह समस्या नहीं है। संस्करण नियंत्रण के तहत घर निर्देशिका होने की तुलना में उस दृष्टिकोण का नकारात्मक पक्ष यह है कि आप git statusकिसी फ़ाइल के बीच अंतर करने के लिए उपयोग नहीं कर सकते हैं जिसे आपने स्पष्ट रूप से अनदेखा करने का निर्णय लिया है (जिसे अनदेखा फ़ाइल में सूचीबद्ध किया जाएगा, इसलिए प्रदर्शित नहीं किया गया) और एक वह फ़ाइल जिसके बारे में आपकी कोई राय नहीं है (जिसे प्रदर्शित किया जाएगा ?)।

कुछ फाइलों को अलग-अलग मशीनों पर अलग-अलग होना चाहिए। मैंने उन्हें एक निर्देशिका में बुलाया ~/Local/SITENAME/libऔर या तो उनके लिए प्रतीकात्मक लिंक बनाए या (फ़ाइल स्वरूपों के लिए जो इसका समर्थन करते हैं) के तहत फ़ाइल में एक निर्देश शामिल है ~/lib। मेरा एक प्रतीकात्मक लिंक भी है ~/Here -> ~/Local/SITENAME। चूंकि गिट्स, सीवीएस के विपरीत, ज्यादातर समान-समान-लेकिन-नहीं-समान रिपॉजिटरी का समर्थन करने के लिए डिज़ाइन किया गया है, मशीन-विशिष्ट फ़ाइलों को प्रबंधित करने का एक बेहतर तरीका हो सकता है। मेरी कुछ डॉट फाइलें वास्तव में प्रतीकात्मक लिंक नहीं हैं, लेकिन स्वचालित रूप से ~/libऔर के तहत सामग्री से उत्पन्न होती हैं ~/Here


शायद आपके पास core.excludesfile = है ~/.gitignore। इस तरह के कॉन्फ़िगरेशन के बिना, फ़ाइल किसी भी भंडार पर लागू नहीं होती है, सिवाय इसके कि इसमें कोई संग्रहीत नहीं है ~/.git(फिर भी यह उप-रिपॉजिटरी पर लागू नहीं होगा)। मैं अपने सभी Git रिपॉजिटरी (स्थान की परवाह किए बिना) पर लागू होने वाले बहिष्करण~/.git-user-excludes और मेरे घर की निर्देशिका के कुछ हिस्सों को रखने वाले रिपॉजिटरी पर लागू किए गए बहिष्कृत के बीच के विवाद से बचने के लिए मैं core.excludesfile = का उपयोग करता हूं।
क्रिस जॉन्सन

@ क्रिस: मैं जानता हूँ कि बहुत कम गिट के बारे में। मुझे इस वाक्य को gitignoreमैन पेज में गलत समझा जा सकता है : "पैटर्न पथ के रूप में एक ही निर्देशिका में एक .gitignore फ़ाइल से पढ़ा जाता है, या किसी भी मूल निर्देशिका (...) में" क्या यह वास्तव में चेकआउट की जड़ पर रुकता है (यानी जहां .gitनिर्देशिका है)?
गाइल्स

1
हां, .gitignoreफ़ाइलों की खोज कार्यशील पेड़ की जड़ से होती है। आपके द्वारा उद्धृत वाक्य जारी है: "(काम के पेड़ की चोटी तक)"।
क्रिस जॉन्सन

@ क्रिस: मैन पेज के मेरे संस्करण में ये शब्द नहीं हैं - ऐसा लगता है कि शब्दांकन को स्पष्ट किया गया है। मैंने अपना उत्तर ठीक कर लिया है। धन्यवाद!
गाइल्स


11

यदि हम सूचीबद्ध हैं तो भी हम ट्रैकिंग फ़ाइलों को जारी रखने के लिए Git की क्षमता का उपयोग कर सकते हैं .gitignore। तो, यह पर्याप्त है .gitignore:

$ cat .gitignore
/*

उस प्रत्येक फ़ाइल के लिए जिसे आप ट्रैक करना चाहते हैं, चलाएं add -f( -fपैरामीटर दोनों में अनदेखी कर रहा है .gitignoreऔर .git/info/exclude):

git add -f .gitignore
git add -f .profile
git add -f .zshrc
git add -f .ssh/config

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

git add -f somedirname

यदि आप इसमें दिखाई देने वाली सभी नई फ़ाइलों के साथ एक पूरी निर्देशिका को ट्रैक करना चाहते हैं , तो इसे .gitignoreएक तरह से बाहर रखा जा सकता है , जो कैम द्वारा उत्तर में वर्णित है :

!/somedirname

यदि आप कभी भी किसी फ़ाइल को ट्रैक करना बंद करना चाहते हैं, तो यह आदेश एक फ़ाइल को Git के सूचकांक से हटा देता है, लेकिन इसे हार्ड ड्राइव पर अछूता छोड़ देता है:

git rm --cached .ssh/config

1
अगर मैं कर सकता था तो मैं आपको अपने अंक देता हूँ। यदि यह ध्यान दिया जाना चाहिए कि इस पद्धति का उपयोग केवल फाइलों को ट्रैक करने के लिए किया जा सकता है, न कि निर्देशिकाओं के लिए। यदि आप एक निर्देशिका में सभी फाइलों को ट्रैक करना चाहते हैं, तो आपको अभी भी। निर्देशिका को उस निर्देशिका को अन-अनदेखा करने की आवश्यकता होगी। अन्यथा उस निर्देशिका में नई फाइलें नई फाइलों के रूप में दिखाई नहीं देंगी।
कैम

5

मैं उसके लिए पुराने का उपयोग करता हूं rcs

के लिए manpages पर एक नज़र डालें ci, coऔर rcs। उन साइटों को भी उपयोगी होना चाहिए:

मैं उदाहरण के लिए अपने dotfiles को नियंत्रित करने वाले संस्करण के लिए उपयोग करता हूं:

ci -u .*vimrc

और अगर मैं उन्हें संपादित करना चाहता हूं:

co -l .*vimrc

मैं RCSआपके नाम की एक निर्देशिका बनाने की सलाह देता हूं ~, फिर आप उस निर्देशिका का आसानी से बैकअप ले सकते हैं।


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

1
हां, मुझे पता है कि यह दिनांकित है। सवाल यह था कि ऐसा करने के लिए एक टिप के लिए। मैंने अभी-अभी इस लड़के को बताया है कि मैं यह कैसे कई सालों से कर रहा हूँ, ("दिनांक", संकेत, संकेत)। इसका मतलब यह नहीं था कि इसे करने का एकमात्र उचित तरीका है।
पोलीमोन

5

मैं $HOME/.conf/एक BitBucket Mercurial रिपॉजिटरी से अपनी कॉन्फिग फाइल की जांच करता हूं । एक GitHub रेपो भी काम करेगा।

~/.confचेकआउट config फाइल और में सिमलिंक को भरने के लिए एक खोल स्क्रिप्ट में शामिल है $HOMEमें प्रत्येक फ़ाइल के लिए ~/.conf। कॉन्फ़िगरेशन प्रारूपों के लिए जो समावेश ( .bashrc,, आदि) का समर्थन करते हैं .inputrc, .vimrcमैं ~/.confफ़ाइल को लिंक के बजाय शामिल करता हूं , ताकि मैं स्थानीय ओवरराइड कर सकूं।

कुछ कॉन्फिग फाइलों के लिए मैं अपने ड्रॉपबॉक्स फोल्डर में एक फाइल के लिए सिम्प्लिंक करता हूं और ड्रॉपबॉक्स के माध्यम से साझा करता हूं।

कुछ महीनों के लिए मैंने $HOMEखुद को संस्करण नियंत्रण में रखने की कोशिश की , लेकिन मैं बड़े पैमाने पर अनदेखी की गई सूचियों को प्रबंधित करने से थक गया, मैं चल रहे एप्लिकेशन द्वारा किए गए कॉन्फ़िगरेशन परिवर्तनों में जांच से थक गया, और परिणाम भी कुछ ऐसा नहीं था जिसे मैं किसी अन्य कंप्यूटर पर जांचना चाहता हूं। तुम पर संघर्ष फिक्सिंग कल्पना कर सकते हैं ~/.gconfया ~/.config/monitors.xml, या इधर-उधर खानपान डेस्कटॉप एप्लिकेशन संस्करणों भिन्न?

मुझे सहानुभूति प्राप्त करना आसान है या इसमें उन कॉन्फ़िगर फ़ाइलों की एक सीमित सूची शामिल है जिन्हें मैंने व्यक्तिगत रूप से अनुकूलित किया है और मशीनों में वैश्विक चूक के रूप में साझा करना चाहते हैं।


3

मैंने निम्नलिखित पायथन डॉटफाइल्स स्क्रिप्ट का उपयोग करना शुरू कर दिया है, जो एक आसान उपकरण है जो आपके लिए फाइलों को ऑटो-लिंक करता है: https://pypi.python.org/pypi/dotfiles


1

मुझे लगता है कि स्रोत नियंत्रण के तहत गैर-संबंधित फ़ोल्डर के लिए आपका दूसरा कूबड़ अच्छा है।

बस वहां 2 शेल स्क्रिप्ट जोड़ें। एक अपने नियंत्रण में फ़ाइलों को कॉपी करने के लिए ~और दूसरा फ़ाइलों को इकट्ठा ~करने और स्रोत-नियंत्रित फ़ोल्डर में वापस कॉपी करने और प्रतिबद्ध करने के लिए।


0

यहाँ एक छोटी रूबी स्क्रिप्ट है जिसका उपयोग मैं एक नई मशीन को सेटअप करने के लिए करता हूँ

#!/usr/bin/env ruby
# setup.rb

#list of dirs which you don't want to symlink
ignored = %w(.gitignore .gitmodules misc setup.rb readme)

current_dir = File.expand_path(Dir.pwd)
home_dir = File.expand_path("~")

links = `git ls-tree --name-only HEAD`.lines.map(&:strip).select {|x| !ignored.include?(x)  }

links.each do |link|
  link = File.join(current_dir, link)
  symlink = File.join(home_dir, File.basename(link))
  `ln -ns #{link} #{symlink}`
end
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.