2016-06-28 9 views
8

हमारे पास एन फ़ोल्डरों के साथ एक गिट भंडार है।गिट submodules, gitslave, गिट subtree या एक सरल समाधान

Repo 
|-Folder1 
|-Folder2 
|- ... 
|-FolderN 

विभिन्न सहयोगियों के साथ हम विभिन्न फ़ोल्डरों को साझा करना चाहते हैं। प्रत्येक सहयोगी को केवल फ़ोल्डरों के अपने अनुमत सबसेट तक पहुंच होनी चाहिए। गिट का उपयोग करके इसे हासिल करने का "अच्छा" तरीका क्या है?


एक उत्तर git submodules का उपयोग करना था। लेकिन जब मैं इस आलेख को पढ़ता हूं: https://codingkilledthecat.wordpress.com/2012/04/28/why-your-company-shouldnt-use-git-submodules/ मुझे समझ में आया कि git submodules का उपयोग करते समय आपको समस्याएं नहीं होने के कारण आपको गिट की अच्छी निपुणता (जो हमारे सहयोगियों का मामला नहीं है) की आवश्यकता है।

मैंने gitslave, और git subtree जैसे कुछ संभावित विकल्पों के बारे में पढ़ा। gitslave एक अच्छा समाधान प्रतीत होता था लेकिन अभी भी मेरी राय में एक जटिल समाधान है।

यहाँ मेरी सरल उपाय है और मुझे पता है कि यह कुछ बहुत बुरा कमियां हैं कर सकते हैं अगर चाहते हैं:

प्रत्येक फ़ोल्डर के लिए एक सरल भंडार और रेपो के लिए भंडार -Having। फिर फ़ोल्डर 1 में सभी फाइलें जोड़ें, ..., मुख्य रिपो में फ़ोल्डर एन।

-globalpush स्क्रिप्ट:

function globalpush(){ 
REPOS="$HOME/Repo/ 
     $HOME/Repo/Folder1 
     $HOME/Repo/Folder2 
     $HOME/Repo/Folder3 
     # ... 
     $HOME/Repo/FolderN" 

#do not show untracked files 
git config status.showuntrackedfiles no 

read -p "Commit description: " description 

for repo in ${REPOS} 
do 
    # if the repo folder exists 
    if [ -d $repo ] 
    then 
     # Go inside the repo 
     cd $repo 
     echo "-----PUSHING REPO : "$repo"-----" 

     #add all modified all deleted TRACKED files 
     git add -u . 

     git commit --allow-empty -m "$description" 
     git push     
    else 
     echo "-----COULD NOT FIND : "$repo"-----" 
    fi 
done 

#show untracked files again 
git config status.showuntrackedfiles normal 
} 

-globalpull स्क्रिप्ट:

function globalpull(){ 
REPOS="$HOME/Repo/ 
     $HOME/Repo/Folder1 
     $HOME/Repo/Folder2 
     $HOME/Repo/Folder3 
     # ... 
     $HOME/Repo/FolderN"   

for repo in ${REPOS} 
do 
    # if the repo folder exists 
    if [ -d $repo ] 
    then 
     # Go inside the repo 
     cd $repo 
     # pull the modifs. 
     echo "-----PULLING REPO : "$repo"-----" 
     git pull       
    else 
     echo "-----COULD NOT FIND : "$repo"-----" 
    fi 
done 
} 

इस समाधान का लाभ हैं:

1 - सरल समाधान है कि हर कोई समझ सकता है।

2 - प्रत्येक फ़ोल्डर के लिए स्वतंत्र रूप से पहुंच अधिकार देने की संभावना।

3 - मुख्य डेवलपर्स (जिनके पास रेपो तक पहुंच है) के लिए रिपोजिटरी रेपो स्वयं निहित है, और इसमें सभी इतिहास शामिल हैं (यदि फ़ोल्डर 1, ..., फ़ोल्डर के भंडारों में कुछ गलत हो जाता है)।

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

संपादित करें:

एक नया आदेश मैं git subrepo के बारे में पता नहीं था ... हो रहा है

+0

वहाँ है कि मेरी स्क्रिप्ट के लिए कुछ ऐसा ही किसी भी उपकरण है? –

+0

मेरा [अनधिकृत कांटा गिटस्लेव] देखें (https://github.com/joelpurra/gitslave), आशा है कि मूल से अधिक सक्रिय 2.0.2 के बाद से किया गया है। –

उत्तर

3

Git-सबट्री था जीत समाधान और वास्तव में यह क्या मैं अपने स्क्रिप्ट के साथ कर रहा था करता है और एक बेहतर "गिट-देशी" तरीके से, और भी बहुत कुछ।

यहां हमारे ट्यूटोरियल का एक लिंक है जिसे हमने अपने पर्यावरण को स्थापित करने के लिए किया है।

https://hpc.uni.lu/blog/2014/understanding-git-subtree/

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