2012-08-02 17 views
7

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

मैंने अपनी ~/.gitconfig फ़ाइल के साथ थोड़ा सा झटका मारा है। ऐसा लगता है कि जब भी मैं 'गिट कॉन्फ़िगर' कमांड चलाता हूं तो जो लिंक मैंने बनाया है वह सही स्थान पर इंगित नहीं करता है उदा। भंडार में फ़ाइल अब ठीक से अद्यतन नहीं है।

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

# Create the link 
$ ln .gitconfig .conf_files/gitconfig # Create the link 

# The files are in fact linked 
[1] pry(main)> File.identical?('.gitconfig', '.conf_files/gitconfig') 
=> true 

# Update the gitconfig file by running a 'git config' command 
$ git config --global alias.last 'log -1 HEAD' 

# The files are no longer linked. 
[2] pry(main)> File.identical?('.gitconfig', '.conf_files/gitconfig') 
=> false 

मुझे लगता है कि यह गिट .gitconfig फ़ाइल लिखने के तरीके से कुछ करने के लिए है। क्या किसी को पता है कि ऐसा क्यों होगा, या कामकाज के लिए कोई रचनात्मक विचार है?

+1

गिट कॉन्फ़िगर हार्ड लिंक तोड़ता है। इसके बजाय एक प्रतीकात्मक लिंक का प्रयोग करें। –

+0

@ विलियम पर्सेल मुझे सही करें अगर मैं गलत हूं लेकिन मुझे नहीं लगता कि गिट प्रतीकात्मक लिंक पहचानता है? –

+2

वास्तविक फ़ाइल को गिट रिपॉजिटरी में रखें, और उसके बाद $ HOME में एक प्रतीकात्मक लिंक डालें। गिट कभी नरम लिंक नहीं देखेगा। –

उत्तर

6

http://www.xxeo.com/archives/2010/02/16/dotfiles-in-git-finally-did-it.html में अपनी टिप्पणी में एली Barzilay के समाधान का प्रयास करें:

तो मैं अंत में एक समाधान है कि दोनों का सबसे अच्छा लेता है मिल गया है: उप-निर्देशिका के रेपो रखा, और सिमलिंक के बजाय, एक जोड़ने "core.worktree" के लिए कॉन्फ़िगरेशन विकल्प आपकी होम निर्देशिका बनने के लिए। अब जब आप अपने घर में हैं निर्देशिका आप एक गिट रेपो में नहीं हैं (इसलिए पहली समस्या चली गई है), और आप को दूसरे मामले में नाजुक सिम्लिंक से निपटने की आवश्यकता नहीं है। आप अभी भी में उन पथों को छोड़ने की मामूली परेशानी है जिन्हें आप संस्करणित नहीं करना चाहते हैं (उदाहरण के लिए, 0g".git/info/extrae" चाल में "*"), लेकिन यह नया नहीं है।

+0

यह बहुत अच्छा काम करता है! यह गिट कमांड के लिए गिट रेपो के रूप में पहचाने जाने वाले प्रत्येक पथ की समस्या को हल करता है, किसी भी प्रकार के लिंक का उपयोग करने की आवश्यकता की समस्याओं से बचाता है, और आपको अपने फाइल सिस्टम की जड़ को अव्यवस्थित करने की आवश्यकता नहीं है। मैंने बस .gconfignore फ़ाइल की सामग्री को '.conf_files/.git/info/extrae' के उत्तर में ले जाया है और यह एक आकर्षण की तरह काम करता है। इसके लिए बहुत - बहुत धन्यवाद! –

2

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

आप अपनी कॉन्फ़िगरेशन फ़ाइलों को अपनी केंद्रीय भंडार में कॉपी या लिंक करने के लिए हमेशा एक स्क्रिप्ट लिख सकते हैं।

+0

यह समझ में आएगा कि हार्ड लिंक क्यों टूटते हैं, लेकिन मुझे उम्मीद थी कि फ़ाइलों को समान रखने के लिए एक आसान/साफ तरीका हो सकता है। –

+0

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

+0

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

0

चेकआउट इस जवाब, शायद यह सहायक हो सकता है:

https://stackoverflow.com/a/3731139/1431696

इस दौरान, आप रिवर्स में लिंक कर विचार किया है? कॉन्फ़िगरेशन फ़ाइलों, आदि से भरा अपनी रिपॉजिटरी बनाएं, और फिर उस स्थान पर जहां आप वास्तव में अपनी फ़ाइलों का उपयोग करते हैं, 'वास्तविक' फ़ाइल के लिए एक कठिन लिंक बनाएं, जो भंडार में बैठता है।

+6

हार्ड लिंक सममित हैं। वे विपरीत में नहीं जाते क्योंकि वे पहले स्थान पर आगे नहीं जाते हैं। –

+0

आह जो एक झटके का थोड़ा सा प्रतीत होता है। – wardd

0

धन्यवाद Dietrich Epp के जवाब और सलाह के लिए मैं अपने फाइल सिस्टम के रूट पर भंडार बनाने, और .gitignore का उपयोग कर केवल फाइलों मेरी रुचि का ट्रैक करने के लिए द्वारा एक अलग कोण से इस समस्या के दृष्टिकोण का फैसला किया है।

मेरे .gitignore फ़ाइल अब इस तरह दिखता है:

/* 

!/etc/ 
/etc/* 

# etc files 
!/etc/rc.conf 
!/etc/asound.conf 
!/etc/mercurial/ 

!/home/ 
!/home/matt/ 
/home/matt/* 

# Home files 
!/home/matt/.xinitrc 
!/home/matt/.gitconfig 
!/home/matt/.bashrc 

# Vim files 
!/home/matt/.vimrc 
!/home/matt/.vim/ 
.netrwhist 

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

मदद लोगों के लिए धन्यवाद!