क्या git कॉन्फ़िगरेशन को कई रिपॉजिटरी में सेट किया जा सकता है?


18

Git तीन स्तरों पर कॉन्फ़िगरेशन मानों का समर्थन करता है:

  • प्रति-सिस्टम वैश्विक सेटिंग्स (संग्रहीत /etc/git-core)
  • प्रति उपयोगकर्ता वैश्विक सेटिंग्स (में संग्रहीत ~/.gitconfig)
  • प्रति-भंडार स्थानीय सेटिंग्स (में संग्रहीत $REPO/.git/config)

ये विकल्प अधिकांश आधार को कवर करते हैं लेकिन मैं चौथे स्तर को संभालने के लिए एक रास्ता तलाश रहा हूं। मेरे पास रिपॉजिटरी का एक (बहुत) बड़ा संग्रह है जिसके लिए मुझे user.emailअपने सामान्य से भिन्न मूल्य का उपयोग करने की आवश्यकता है । ये रिपॉजिटरी अक्सर स्वचालित स्क्रिप्ट के माध्यम से बनाई और हेरफेर की जाती हैं, और रिपॉजिटरी स्थानीय सेटिंग्स के अनुसार स्थापित करना बोझिल है।

प्रश्न में सभी रिपॉजिटरी मेरे स्थानीय सिस्टम पर एक निश्चित पथ उपसर्ग के तहत स्थित हैं। क्या कहीं एक कॉन्फ़िगरेशन मान सेट करने का एक तरीका है जो उस पथ के तहत सभी रिपॉजिटरी द्वारा विरासत में मिलेगा? (तरह तरह की .htaccessसेटिंग्स फ़ाइल सिस्टम को सभी तरह से विरासत में मिला है।) शायद वैश्विक कॉन्फ़िगरेशन फ़ाइल में सशर्त मान सेट करने का एक तरीका होगा? UNIX माहौल में खदान जैसी रिपॉजिटरी के सेट के साथ और क्या व्यवस्था की जा सकती है?


मेरी पहली प्रतिज्ञा .gitconfigउनके द्वारा बनाई गई प्रत्येक निर्देशिका में स्क्रिप्ट को हैक करने के लिए है। उदाहरण के लिए, IIRC Android का रेपो ऐसा कर सकता है, लेकिन आपको इसका पता लगाने के लिए स्रोत को ध्यान से पढ़ना होगा। (मुझे पूरी तरह से यकीन नहीं है, मैंने थोड़ी देर में ऐसा नहीं किया है।)
गिल्स एसओ- बुराई को रोकें '

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

जवाबों:


11

मुझे इस चौथे स्तर पर git को कॉन्फ़िगर करने का कोई तरीका नहीं मिला है। एकमात्र तरीका प्रति-कमांड कॉन्फ़िगरेशन मान का उपयोग करता हुआ दिखता है git -c key=value

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

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c user.email=alternate@credentials.org "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}

क्या मैं कर सकता हूं command git -c user.email=alternate@credentials.org user.name="Alter Ego" "$@"या मुझे इसके बारे में कैसे जाना चाहिए? उच्च और निम्न और इस -c ध्वज का एकमात्र संदर्भ जो मुझे मिला वह आपका था, धन्यवाद, बहुत सराहना की गई।
विक गोल्डफेल्ड

रिकॉर्ड के लिए, मुझे इसके साथ काम करने का मौका मिलाcommand git -c user.email=alternate@credentials.org -c user.name="Alter Ego" "$@"
विक गोल्डफेल्ड

6

आप पर्यावरण चर के साथ गिट के लिए ईमेल पते को कॉन्फ़िगर कर सकते हैं GIT_AUTHOR_EMAIL। यदि आप इसे एक निर्देशिका या निर्देशिका विशिष्ट शेल कॉन्फ़िगरेशन में zsh के साथ दर्ज करने पर Execute bash स्क्रिप्ट के साथ जोड़ते हैं, तो आप आसानी से प्रति निर्देशिका या मूल निर्देशिका में सेटिंग्स बदल सकते हैं, उदाहरण के लिए, यदि आप एक निर्देशिका में प्रवेश करते हैं, तो ~/workअपने ईमेल को बदलने के लिए स्वचालित रूप से परिवेश चर समायोजित कर सकते हैं। पता।


2

Git कॉन्फ़िगरेशन पर आधारित समाधान देखें:

http://gik.firetrot.com/index.php/2018/05/06/git-configuration-across-multiple-repositories/

"~ / .Gitconfig" फ़ाइल में जोड़ें:

    [includeIf "gitdir:~/work/project1/.git"]  
      path = .gitconfig-project1  

सामग्री के साथ "~ / .gitconfig-project1 content फ़ाइल बनाएँ:

    [core]  
      sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"  

    [user]  
      name = user1  
      email = user1@email.com  

"शामिल" अगर विधेय मेरे सिरदर्द को बचाता है!
ट्रूंग गुयेन

1

कालेब के उत्तर के आधार पर, हम एक संशोधित gitकमांड को परिभाषित कर सकते हैं जो इस निर्देशिका के सभी रिपॉजिटरी को स्थायी रूप से सही ढंग से कॉन्फ़िगर करता है, ताकि भविष्य में वेनिला गिट के सभी नए कॉन्फ़िगरेशन का उपयोग करें। मैं उपयोग करता हूं hub, जो एक और git आवरण है, इसलिए मैंने इसे इसके alias git=hubसाथ बदल दिया और hubअपने फ़ंक्शन में कॉल किया - यदि आप उपयोग नहीं करते हैं hub, तो सभी hubइनवोकेशन को इसके साथ बदलें command git:

function git() {
    case "$PWD" in
        /home/robin/git/3RD_PARTY)
            hub "$@"
            # We don't know which repository was cloned / operated on, so let's just reconfigure them all
            for f in *; do
                [[ -d "$f" ]] && hub -C "$f" config user.email $my_private_email
            done
            ;;
        /home/robin/git/3RD_PARTY/*)
            hub "$@"
            hub config user.email $my_private_email
            ;;
        *)
            hub "$@"
            ;;
    esac
}

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.