2010-02-12 19 views
16

यहाँ में एक unversioned फ़ाइल रखने के लिए किया जाता है समस्या क्या यह संभव है:एक Git भंडार

मैं अपने होस्टिंग साथी जगह है, जो मैं सभी स्थानों/कंप्यूटर मैं बनाए रखने से संदर्भ भंडार के रूप में उपयोग करने पर नंगे Git भंडार बनाया से मेरी परियोजना।

बात यह है कि मेरी परियोजना एक स्क्लाइट डीबी फ़ाइल का उपयोग कर रही है, जो नियमित रूप से बढ़ती रहती है (यह अब लगभग 150 एमबी है)। जैसे ही समय बीत रहा है, मेरा .git फ़ोल्डर बड़ा और बड़ा हो रहा है (हाल ही में लगभग 1 जीबी)। और मेरी होस्टिंग जगह सीमित है।

मुझे इस डीबी फ़ाइल के हेड संस्करण को रखने के लिए नंगे भंडार की आवश्यकता है, लेकिन मुझे वास्तव में इसके संस्करण इतिहास को रखने की आवश्यकता नहीं है।

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

क्या कोई फ़ाइल का अंतिम संस्करण रखने और उसका इतिहास छोड़ने के लिए गिट को बताने का कोई तरीका है?

+1

संबंधित प्रश्न: http://stackoverflow.com/questions/540535/managing-large-binary-files-with-git – jfs

+0

यह प्रत्यक्ष समाधान नहीं हो सकता है, लेकिन डेटा बेस फ़ाइल को अनचाहे क्यों नहीं रखें और एक स्क्रिप्ट बनाएं जो फ़ाइल को मुख्य भंडार में फ़ाइल के साथ सिंक्रनाइज़ करता है? –

+0

स्कीमा की एक प्रति, या डेटा रखने के लिए आपको इस डीबी फ़ाइल की आवश्यकता क्यों है? अथवा दोनों? –

उत्तर

5

संक्षिप्त उत्तर: नहीं।

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

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

ID=`git hash-object -w yourfile.sqlite` 
git tag -a -m "Tag database file" mytag $ID 

कोई रास्ता नहीं है कि आसानी से काम कर पेड़ में डेटाबेस फ़ाइल को अद्यतन करता है (या यहाँ तक बनाने) आप ... आपको लगता है कि अनुकरण करने के लिए हुक स्क्रिप्ट का उपयोग करना होगा के लिए है।

पूर्ण प्रकटीकरण: मुझे पूरी तरह से यकीन नहीं है कि टैग किए गए ब्लॉब्स को धक्का देना वास्तव में संभव है या नहीं, जो सामान्य इतिहास से ढके नहीं हैं। मुझे संदेह है कि यह नहीं है, इस मामले में यह नुस्खा उपयोगी से बहुत कम होगा।

3

शुरुआत के लिए आप हमेशा इसके लिए .gitignore कॉन्फ़िगरेशन फ़ाइल का उपयोग कर सकते हैं।

और ... (से this thread: ब्योर्न Steinbrink के लिए प्रशंसा)

उपयोग फिल्टर शाखा पहले आप रखने के लिए, और उसके बाद वर्ष cruft ड्रॉप चाहते प्रतिबद्ध पर माता-पिता को छोड़ ।

मान लें कि $drop का नवीनतम है जिसे आप छोड़ना चाहते हैं। चीजों को कम और सरल रखें, सुनिश्चित करें कि पहला प्रतिबद्धता जिसे आप रखना चाहते हैं, यानी। $drop का बच्चा, प्रतिबद्धता विलय नहीं है। तो फिर आप का उपयोग कर सकते हैं:

git filter-branch --parent-filter "sed -e 's/-p $drop//'" \ 
    --tag-name-filter cat -- \ 
    --all ^$drop 

ऊपर सभी प्रतिबद्ध है कि $drop "के बाद" आने के माता-पिता का पुनर्लेखन।

परिणाम gitk के साथ जांचें।

फिर, सभी पुराने क्रॉफ्ट को साफ करने के लिए।

पहले, फिल्टर शाखा से बैकअप संदर्भ:

git for-each-ref --format='%(refname)'refs/original | \ 
    while read ref 
    do 
      git update-ref -d "$ref" 
    done 

अपने reflogs तो साफ:

git reflog expire --expire=0 --all 

और अंत में, repack और सभी वर्ष तक नहीं पहुंचा जा वस्तुओं ड्रॉप: Git repack -ad git prune # उन ऑब्जेक्ट्स के लिए जो repack -ad के आसपास

उस बिंदु पर, प्रत्येक बिंदु पर हो सकता है तक बढ़ने वाली चीज $ ड्रॉप के साथ होनी चाहिए।

+0

मैं एक समाधान की तलाश में हूं जो भंडार –

+0

में डीबी की एक प्रति * रखता है फिर आप एक स्क्रिप्ट बना सकते हैं जो प्रत्येक प्रतिबद्धता के बाद इतिहास को हटा देता है। –

4

ऐसा लगता है कि आप गलत समस्या का समाधान ढूंढ रहे हैं।

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

इसके बजाय, आपको स्कीमा को संस्करण नियंत्रण में रखना चाहिए, और यदि आपको डेटा भी रखना है, तो इसे क्रमबद्ध करें (एक्सएमएल, जेएसओएन, वाईएएमएल ...) और संस्करण भी। एक बिल्ड स्क्रिप्ट डेटाबेस बना सकती है और आवश्यक होने पर डेटा को बेअसर कर सकती है।

क्योंकि टेक्स्ट-आधारित क्रमबद्धता प्रारूप को गिट द्वारा कुशलतापूर्वक ट्रैक किया जा सकता है, तो आप पिछले संस्करणों को रखने के स्थान के ऊपर की ओर चिंता नहीं करेंगे, भले ही आपको नहीं लगता कि आपको उनकी पहुंच की आवश्यकता है।

+0

ऐसा करने से गिट को इसके सामान्य संपीड़न और diffing तकनीकों को लागू करने की अनुमति होगी जिससे यह बहुत कम दर्दनाक हो। देखभाल करने की एकमात्र चीज एक उचित क्रमबद्ध क्रमबद्ध प्रारूप बनाना होगा जो diff के आकार को कम करेगा। –

+0

मैं सहमत नहीं हूं। यदि आप पतले प्रारूप को देखते हैं, तो यह बाइनरी नहीं है। गिट इसके साथ कुछ उपयोग करने योग्य diffs उत्पन्न करने में पूरी तरह से सक्षम है। एकमात्र लाभ यह होगा कि संघर्ष के मामले में अंतर को पढ़ना आसान होगा। यदि आप मुझसे पूछें –

+0

यह एक अच्छा विचार है ... क्या टेक्स्ट-आधारित क्रमबद्ध करने के लिए आपके पास एक पसंदीदा स्क्रिप्ट है, तो टेक्स्ट क्रमबद्धता परत को संभालने के लिए बहुत अधिक काम है? – AlexMA

0

यदि मैं आपका प्रश्न समझता हूं, तो मुझे लगता है कि मेरे पास एक आसान समाधान है।

  1. पहले बैकअप फ़ाइल कहीं,
  2. अपने काम dir/पेड़ से नहीं हटेगी। जीआईटी आरएम नहीं, बस आरएम।
  3. एक प्रतिबद्ध करें।
  4. सुनिश्चित करें कि फ़ाइल .gitignore में जोड़ा गया है।

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

0

अपने .gitignore में sqlite.db जोड़ें।

चेक-इन (संभावित) वर्तमान शाखा के साथ धकेलने के लिए वर्तमान डाटाबेस के लिए:

branch="$(sed 's,.*refs/heads/,,' "$(git rev-parse --git-dir)"/HEAD)" 
objectname=$(git hash_object -w "$(git rev-parse --show-toplevel)/sqlite.db") 
git tag -f db_heads/$branch $objectname 

जब एक शाखा धक्का:

git fetch origin $branch tags/db_heads/$branch:tags/db_heads/$branch 
:

git push origin $branch +db_heads/$branch 

जब एक शाखा प्राप्त करने में कठिनाई

शाखा की जांच करते समय:

git checkout $branch 
git cat-file -p db_heads/$branch >"$(git rev-parse --show_toplevel)/sqlite.db" 

और ऐसा करना चाहिए, मुझे लगता है।

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