क्या विभिन्न परियोजनाओं के लिए अलग-अलग Git विन्यास होना संभव है?


314

.gitconfigआमतौर पर user.homeनिर्देशिका में संग्रहीत किया जाता है ।

मैं कंपनी ए के लिए परियोजनाओं पर काम करने के लिए एक अलग पहचान का उपयोग करता हूं और कंपनी बी के लिए कुछ और (मुख्य रूप से नाम / ईमेल)। मेरे पास दो अलग-अलग Git कॉन्फ़िगरेशन कैसे हो सकते हैं ताकि मेरा चेक-इन नाम / ईमेल के साथ न हो?

जवाबों:


263

.git/configभंडार की एक विशेष क्लोन में फ़ाइल है कि क्लोन करने के लिए स्थानीय है। वहां रखी गई कोई भी सेटिंग केवल उस विशेष परियोजना के लिए क्रियाओं को प्रभावित करेगी।

(डिफ़ॉल्ट रूप से, git configसंशोधित करता है .git/config, ~/.gitconfigकेवल - --globalइसके साथ बाद वाले को संशोधित नहीं करता है।)


इसलिए रेपो में स्वयं के लिए कॉन्फिगर फाइल को संशोधित करना, उदाहरण के लिए [user] email = ...ब्लॉक बदलना , ग्लोबल को ओवरराइड करेगा ~/.gitconfig- और यह केवल आपके उपयोगकर्ता के लिए है?
dcsan

281

गिट विन्यास के 3 स्तर हैं; परियोजना, वैश्विक और प्रणाली।

  • परियोजना : परियोजना विन्यास केवल वर्तमान परियोजना के लिए उपलब्ध है और परियोजना की निर्देशिका में .it / config में संग्रहीत है।
  • वैश्विक : वैश्विक कॉन्फ़िगरेशन वर्तमान उपयोगकर्ता के लिए सभी परियोजनाओं के लिए उपलब्ध हैं और ~ / .itconfig में संग्रहीत हैं।
  • सिस्टम : सिस्टम कॉन्फ़िगरेशन सभी उपयोगकर्ताओं / परियोजनाओं के लिए उपलब्ध है और / etc / gitconfig में संग्रहीत है।

एक परियोजना विशिष्ट विन्यास बनाएं, आपको परियोजना की निर्देशिका के तहत इसे निष्पादित करना होगा:

$ git config user.name "John Doe" 

एक वैश्विक कॉन्फ़िगरेशन बनाएं:

$ git config --global user.name "John Doe"

सिस्टम कॉन्फिगर बनाएं:

$ git config --system user.name "John Doe" 

और जैसा कि आप अनुमान लगा सकते हैं, परियोजना वैश्विक और वैश्विक ओवरराइड सिस्टम को ओवरराइड करती है।


68
क्या कुछ "निर्देशिका" कॉन्फिगर करने की संभावना है? मैं घर पर कुछ काम करता हूं और काम के प्रोजेक्ट और अपने खुद के साथ फ़ोल्डर प्राप्त करता हूं। इसलिए मुझे फ़ोल्डर्स मिल गए ~ / job और ~ / git repos के साथ और उनके अंतर्गत आने वाले प्रोजेक्ट्स के लिए अलग-अलग कॉन्फिग चाहते हैं। जैसे नौकरी / प्रोजेक्ट 1 में नौकरी / .itconfig से कॉन्फ़िगर किया गया है।
सर्ग

2
अगर आपने निर्देशिका स्तर का कॉन्फिगरेशन बनाना संभव किया तो क्या @Serge ने कभी पता लगाया? मेरे पास अभी वही मुद्दा है।
पूछताछ

2
नहीं, मैं व्यक्तिगत डेटा के लिए समग्र सिस्टम कॉन्फिगरेशन सेट करता हूं और एक कमांड में कुछ प्रोजेक्ट कॉन्फिगर को जॉब डेटा सेट करने के लिए बैश स्क्रिप्ट बनाता हूं।
सर्ज

1
परिशिष्ट के रूप में: बस git config user.nameया git config user.emailआपको नाम या ईमेल दिखाया जाएगा जो वर्तमान रेस्पॉन्सरी के लिए उपयोग करेगा।
अभिषेक दिवेकर

1
मैंने zsh के लिए यह करना समाप्त कर दिया : gist.github.com/pgarciacamou/3b67320e2940c8d7fa3d7bbd73873106 , मुझे उम्मीद है कि इससे किसी को मदद मिलेगी।
pgarciacamou

219

2.13 संस्करण के रूप में, git सशर्त विन्यास का समर्थन करता है । इस उदाहरण में हम ~/company_aनिर्देशिका में कंपनी ए के रिपोज को क्लोन करते हैं और कंपनी बी के रिपोज को ~/company_b

अपने में .gitconfigआप कुछ इस तरह से डाल सकते हैं।

[includeIf "gitdir:~/company_a/"]
  path = .gitconfig-company_a
[includeIf "gitdir:~/company_b/"]
  path = .gitconfig-company_b

उदाहरण .gitconfig-company_a की सामग्री

[user]
name = John Smith
email = john.smith@companya.net

उदाहरण .gitconfig-company_b की सामग्री

[user]
name = John Smith
email = js@companyb.com

1
यह देखने के लिए बहुत अच्छा है यह संस्करण 2.13 में जोड़ा गया है। मैं थोड़ी देर के लिए github.com/bddenhartog/git-profiles का उपयोग कर रहा हूं , लेकिन इसे टॉवर के साथ काम करने के लिए नहीं मिला।
adrum

4
शामिल हैं यदि मैं थोड़ा छोटा है, तो देखें: stackoverflow.com/questions/43919191/…
रूबल

आपके द्वारा लिंक किया गया प्रलेखन पृष्ठ इस बात का उल्लेख नहीं करता है ... वास्तव में, इसमें शामिल करने के लिए खोज करने से दस्तावेज़ीकरण में कोई परिणाम नहीं मिलता है
थॉमस लेवेस्क

1
@ThomasLevesque अजीब है। मुझे यकीन है कि इसने इसके बारे में कुछ कहा है। आप इसे
चेंगलोग

2
@JosephLust को आपको git> = 2.13 (Ubuntu 16.04 में git 2.7) स्थापित करने की आवश्यकता है । Git PPA के माध्यम से git का नवीनतम संस्करण प्राप्त करें और यह काम करेगा :)
Cas

24

धन्यवाद @ crea1

एक छोटा संस्करण:

जैसा कि यह https://git-scm.com/docs/git-config#_includes पर लिखा गया है :

यदि पैटर्न के साथ समाप्त होता है /, **तो स्वचालित रूप से जोड़ दिया जाएगा। उदाहरण के लिए, पैटर्न foo/बन जाता है foo/**। दूसरे शब्दों में, यह मेल खाता है fooऔर सब कुछ अंदर, पुनरावृत्ति करता है।

इसलिए मैं अपने मामले में उपयोग करता हूं,
~ / .gitconfig :

[user] # as default, personal needs
    email = myalias@personal-domain.fr
    name = bcag2
[includeIf "gitdir:~/workspace/"] # job needs, like workspace/* so all included projects
    path = .gitconfig-job

# all others section: core, alias, log…

इसलिए यदि प्रोजेक्ट डायरेक्टरी मेरे पास है ~/wokspace/, तो डिफ़ॉल्ट उपयोगकर्ता सेटिंग्स को
~ / .gitconfig-w से बदल दिया जाता है :

[user]
name = John Smith
email = js@company.com

यह किया, अब सही उपयोगकर्ता नाम और ईमेल विभिन्न निर्देशिकाओं में सेट किया गया है। जब मैं git config user.name / git config user.email करता हूं तो मुझे सही विवरण मिलता है। लेकिन जब मैं व्यक्तिगत रेपो में टिप्पणी करता हूं, तो यह हमेशा वैश्विक आधिकारिक उपयोगकर्ता नाम ईमेल
भूपेंद्र

@ भूपेंद्र मेरे नमूने में, .gitconfig और .gitconfig-job मेरे घर में है, न कि प्रोजेक्ट डायरेक्टरी में। क्या आपको दो से अधिक की आवश्यकता है? क्या आपने अपने होम डायरेक्टरी में .gitconfig-alternativ, 3 नमूने के साथ, मेरे .gitconfig-job के रूप में बनाया है।
bcag2

@ bcag2 मैंने भी ऊपर दिए गए उदाहरण का अनुसरण किया है। मेरे पास 2 कॉन्फिग्स हैं जो डिफॉल्ट एक और व्यक्तिगत gitconfig- जॉब के समान हैं। जब मैं पर्सनल डायरेक्टरी में होता हूं, तो git config user.name पर मुझे सही नाम दिया जाता है लेकिन कमिट को पुश करने के लिए यह डिफॉल्ट लेता है जबकि मुझे पर्सनल की जरूरत है।
स्वप्निल

@ swapnil2993 सबसे पहले मैं पथ के मुद्दे पर सोचता हूं, लेकिन अगर git config user.nameएक सही वापसी करता है, तो यह ठीक होना चाहिए। क्या आप GNU / Linux या अन्य OS के अंतर्गत हैं?
bcag2

@ bcag2 ने इस मुद्दे को हल किया। बस रास्ता सही किया। लेकिन git config user.name सही मान लौटाना अजीब था। जवाब के लिए धन्यवाद।
स्वप्निल 2993

13

स्पष्ट होने के लिए, आप वर्तमान रिपॉजिटरी कॉन्फ़िगरेशन फ़ाइल--local का उपयोग करने के लिए भी उपयोग कर सकते हैं :

git config --local user.name "John Doe" 

12

आप पर्यावरण चर GIT_CONFIGको उस फ़ाइल पर भी इंगित कर सकते हैं जिसका git configउपयोग करना चाहिए। GIT_CONFIG=~/.gitconfig-A git config key valueनिर्दिष्ट फ़ाइल के साथ हेरफेर हो जाता है।


2
ठंडा; थोड़ा चतुर खोल जादू के साथ यह चीजों को सेट करने के लिए इस्तेमाल किया जा सकता है इसलिए गिट पहले उठाता है। वर्तमान में रेपो के ऊपर dir ट्री को ट्रेस करने पर यह पाता है। धन्यवाद!
इकोमानोट

1
क्या आपके पास इस शेल मैजिक का लिंक है जो ऐसा करता है? उपयोगी लगता है!
पिकासो


एक सरल समाधान के लिए धन्यवाद, जिसे केवल एक पर्यावरण चर को बदलने की आवश्यकता है।
नूह सुस्मान

यह केवल git config कमांड को प्रभावित करता है अब github.com/git/git/blob/master/Documentation/RelNotes/…
foray1010

12

मैं निम्नलिखित तरीके से अपने ईमेल के लिए यह कर रहा हूं:

git config --global alias.hobbyprofile 'config user.email "me@example.com"'

फिर जब मैं एक नई कार्य परियोजना को क्लोन करता हूं, तो मुझे केवल चलाना होता है git hobbyprofileऔर इसे उस ईमेल का उपयोग करने के लिए कॉन्फ़िगर किया जाएगा।


3

एक और तरीका है direnv का उपयोग करना और प्रति डायरेक्टरी को अलग-अलग फाइल को अलग करना। उदाहरण के लिए:

.
├── companyA
│  ├── .envrc
│  └── .gitconfig
├── companyB
│  ├── .envrc
│  └── .gitconfig
└── personal
   ├── .envrc
   └── .gitconfig

प्रत्येक .envrcमें कुछ ऐसा होना चाहिए:

export GIT_CONFIG=$(pwd)/.gitconfig

और .gitconfigवांछित मूल्यों के साथ सामान्य gitconfig है।


2

आप रिपॉजिटरी विशिष्ट कॉन्फ़िगरेशन फ़ाइल (यानी /path/to/repo/.git/config) को बदलकर किसी प्रोजेक्ट के गिट कॉन्फ़िगरेशन को कस्टमाइज़ कर सकते हैं । BTW, git configडिफ़ॉल्ट रूप से इस फाइल को लिखता है:

cd /path/to/repo
git config user.name 'John Doe'  # sets user.name locally for the repo

मैं विभिन्न परियोजनाओं (जैसे ~/.gitconfig.d/) के लिए अलग प्रोफाइल बनाना पसंद करता हूं और फिर उन्हें रिपॉजिटरी की कॉन्फिगर फाइल में शामिल करता हूं:

cd /path/to/repo
git config include.path '~/.gitconfig.d/myproject.conf'

यह अच्छी तरह से काम करता है अगर आपको एक ही परियोजना के कई रिपॉजिट में समान विकल्पों का उपयोग करने की आवश्यकता है। आप प्रोफ़ाइल में हेरफेर करने के लिए शेल उपनाम या एक कस्टम Git कमांड भी सेट कर सकते हैं।


0

मैं एक ही नाव में हूं। मैंने उन्हें प्रबंधित करने के लिए थोड़ी बैश स्क्रिप्ट लिखी। https://github.com/thejeffreystone/setgit

#!/bin/bash

# setgit
#
# Script to manage multiple global gitconfigs
# 
# To save your current .gitconfig to .gitconfig-this just run:
# setgit -s this
#
# To load .gitconfig-this to .gitconfig it run:
# setgit -f this
# 
# 
# 
# Author: Jeffrey Stone <thejeffreystone@gmail.com>

usage(){
  echo "$(basename $0) [-h] [-f name]" 
  echo ""
  echo "where:"
  echo " -h  Show Help Text"
  echo " -f  Load the .gitconfig file based on option passed"
  echo ""
  exit 1  
}

if [ $# -lt 1 ]
then
  usage
  exit
fi

while getopts ':hf:' option; do
  case "$option" in
      h) usage
         exit
         ;;
      f) echo "Loading .gitconfig from .gitconfig-$OPTARG"
         cat ~/.gitconfig-$OPTARG > ~/.gitconfig
         ;;
      *) printf "illegal option: '%s'\n" "$OPTARG" >&2
         echo "$usage" >&2
         exit 1
         ;;
    esac
done

यहाँ आपकी स्क्रिप्ट बैश में है, जबकि गितुब पर आपके पास पायथन संस्करण है। साथ ही -sआपकी बैश स्क्रिप्ट में संभाला नहीं है।
वादिम कोटोव

0

git stashमेरे स्थानीय परिवर्तनों की कोशिश करते समय मुझसे एक त्रुटि हुई । Git की त्रुटि ने कहा "कृपया मुझे बताएं कि आप कौन हैं" और फिर मुझसे कहा "चलाएं git config --global user.email "you@example.comऔर git config --global user.name "Your name"अपने खाते की डिफ़ॉल्ट पहचान सेट करें।" हालाँकि, आपको अपनी वर्तमान रिपॉजिटरी में पहचान सेट करने के लिए Omit --global होना चाहिए ।

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