2011-05-27 16 views
38

Android source एक large hierarchy of git repositories है। उन्हें repo नामक एक कस्टम स्क्रिप्ट द्वारा प्रबंधित किया जाता है। रिपो निर्धारित करता है कि कौन सा गिट रिपॉजिटरीज़ manifest.xml का उपयोग करके प्रबंधित करना है। manifest.xml of Android अन्य सभी गिट भंडारों के साथ एक गिट भंडार में होस्ट किया गया है।एंड्रॉइड रेपो मैनिफेस्ट रिपोजिटरी कैसे काम करता है?

एंड्रॉइड में यह संग्रह कैसे प्रबंधित किया जाता है? विशेष रूप से प्रत्येक शाखा में आयोजित विभिन्न शाखाओं और विभिन्न फाइलों को कैसे व्यवस्थित किया जाता है?

उत्तर

6

रेपो की जड़ पर ".repo" नामक एक छिपी हुई निर्देशिका है, अंदर आपको "manifests" नामक एक गिट प्रोजेक्ट मिलेगा जिसमें आमतौर पर "default.xml" नाम की एक फ़ाइल होती है। इस फ़ाइल में सभी परियोजनाओं के बारे में जानकारी है और जहां उनके संबंधित गिट भंडार स्थित हैं। इस फ़ाइल को तब भी संस्करणित किया जाता है जब आप "रेपो इनिट-बी एक्सवाईजेड" कमांड का उपयोग करते हैं, इसे वापस कर दिया जाएगा और आप उन पुराने शाखाओं में वापस आ सकते हैं जो सिर की तुलना में गिट परियोजनाओं को जोड़/हटा सकते हैं।

यहाँ प्रकट प्रारूप का वर्णन रेपो Git रेपो दस्तावेज़ के लिए लिंक है:

https://gerrit.googlesource.com/git-repo/+/master/docs/manifest-format.txt

+0

लिंक टूटी हुई है। –

56

पहले, रेपो init .repo निर्देशिका बनाता है, क्लोन Git भंडार .repo/repo को https://android.googlesource.com/tools/repo, और Git भंडार निर्दिष्ट -u.repo/manifests.git पर एक नंगे भंडार के विकल्प के साथ। उसके बाद, यह .repo/manifests निर्देशिका बनाता है, इसे .repo/manifests/.git से .repo/manifests.git पर प्रतीकात्मक लिंक बनाकर इसे एक गिट भंडार में परिवर्तित करता है। इसके बाद -b में निर्दिष्ट शाखा को चेक आउट करता है, और में निर्दिष्ट फ़ाइल (-m विकल्प) में निर्दिष्ट .repo/manifests/default.xml पर निर्दिष्ट फ़ाइल .repo/manifest.xml पर एक प्रतीकात्मक लिंक बनाता है।

मोटे तौर पर इस प्रकार है:

 
    repo init -u $URL -b $BRANCH -m $MANIFEST 
    -------------------- 
    mkdir .repo; cd .repo 
    git clone https://android.googlesource.com/tools/repo 
    git clone --bare $URL manifests.git 
    mkdir -p manifests/.git; cd manifests/.git 
    for i in ../../manifests.git/*; do ln -s $ı .; done 
    cd .. 
    git checkout $BRANCH -- . 
    cd .. 
    ln -s manifests/$MANIFEST manifest.xml 

आप पता लगा सकते हैं कि वास्तव में क्या repo --trace init ...

फिर साथ होता है, manifest.xml और local_manifest.xml में प्रत्येक परियोजना के लिए .repo/projects को रेपो सिंक क्लोन Git संग्रह, .git होने के साथ काम करने निर्देशिका बनाता है संबंधित नंगे भंडार के लिए सिम्लिंक, मैनिफेस्ट में निर्दिष्ट शाखा को चेक करता है, और .repo/project.list अद्यतन करता है। वह मामला जहां परियोजनाएं पहले से ही अलग हैं, अनिवार्य रूप से git pull --rebase प्रदर्शन कर रही है।

+0

इस बारे में स्पष्टीकरण सुनना अच्छा लगेगा कि वे इस तरह से काम क्यों करते हैं! विशेष रूप से, '.repo/projects /' के अंदर सभी '.git' सामग्री को संग्रहीत करने का क्या फायदा है? – Hamy

+0

मुझे नहीं पता कि क्यों 'repo' के पीछे लोगों ने उनके दृष्टिकोण को चुना है। 'रेपो' के कुछ संस्करणों के साथ, विभिन्न बिल्ड पेड़ों के बीच '.repo/projects' निर्देशिका साझा करना संभव था, जो एक छोटे हार्ड ड्राइव वाले लैपटॉप पर कामयाब था।लेकिन यह कभी समर्थित नहीं था, और मुझे यकीन नहीं है कि यह अब और काम करता है। –

+2

@ हैमी - यह गिट ऑब्जेक्ट्स को खोए बिना एक दृश्य प्रोजेक्ट बिल्ड निर्देशिका को आरएम-आरआर करने की अनुमति देता है, इसलिए बाद में रेपो सिंक तेज़ होगा। –

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