क्या मैं .gitconfig में अपने लिए कई उपयोगकर्ता निर्दिष्ट कर सकता हूं?


753

अपने में ~/.gitconfig, मैं अपना व्यक्तिगत ईमेल पता नीचे सूचीबद्ध करता हूं [user], क्योंकि मैं जीथब रिपोज के लिए उपयोग करना चाहता हूं।

लेकिन, मैंने हाल ही में काम के लिए git का उपयोग करना शुरू कर दिया है। मेरी कंपनी की गिट रेपो मुझे प्रतिबद्ध करने की अनुमति देता है, लेकिन जब यह नए बदलावों की घोषणा करता है, तो यह कहता है कि वे बेनामी से हैं क्योंकि यह मेरे ईमेल पते को नहीं पहचानता है .gitconfig- कम से कम, यह मेरा सिद्धांत है।

क्या कई [user]परिभाषाओं को निर्दिष्ट करना संभव है .gitconfig? या .gitconfigएक निश्चित निर्देशिका के लिए डिफ़ॉल्ट को ओवरराइड करने का कोई और तरीका है ? मेरे मामले में, मैं सभी कार्य कोड की जांच करता हूं ~/worksrc/- क्या .gitconfigकेवल उस निर्देशिका (और उसके उपनिर्देशिका) के लिए निर्दिष्ट करने का एक तरीका है ?



1
मुझे आश्चर्य है कि आपकी कंपनी का सर्वर ऐसा करेगा - उसे काम करने के लिए अपनी प्रतिबद्धताओं की छाया को बदलना होगा। यदि आप एक स्थानीय चेकआउट के लिए प्रतिबद्ध हैं, तो आप किस उपयोगकर्ता नाम को देखते हैं?
एलेक्स ब्राउन

1
@ एलेक्स: वहाँ महत्वपूर्ण बिट को भूल गए - यह आसानी से ईमेल अधिसूचना पर केवल एक नाम हो सकता है, वास्तव में कमिट पर कुछ भी नहीं बदल रहा है।
कैस्केबेल

1
आप इस आवर्ती कार्य को स्वचालित करने के लिए गिट-हुक का उपयोग कर सकते हैं: github.com/DrVanScott/git-clone-init
हेनिंग

1
कृपया इस जवाब को स्वीकार: stackoverflow.com/a/43654115/482899 । 2.13 के बाद से यह सबसे अच्छा समाधान है।
नॉर्थट्री

जवाबों:


1015

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

git config user.name "Your Name Here"
git config user.email your@email.com

जबकि डिफ़ॉल्ट उपयोगकर्ता / ईमेल आपके ~ / .itconfig में कॉन्फ़िगर किया गया है

git config --global user.name "Your Name Here"
git config --global user.email your@email.com

83
आप .git/configफ़ाइल में इन सेटिंग्स के प्रभावों को देख सकते हैं
Abizern

21
आप उन कॉन्फ़िगर फ़ाइलों को मैन्युअल रूप से संपादित कर सकते हैं git config --editऔर git config --global --edit। और यदि आप अबीज़र्न की टिप्पणी से चूक गए हैं , तो एक रिपॉजिटरी की कॉन्फिग फ़ाइल चालू है <repo-root>/.git/config
रोरी ओ'केन

13
आपको GIT_AUTHOR_EMAIL और GIT_COMMITTER_EMAIL (और * _NAME) को भी अनसेट करना चाहिए क्योंकि वे स्थानीय सेटिंग को ओवरराइड करेंगे
ACyclic

6
क्या किसी दिए गए फ़ोल्डर में सभी रिपोज के लिए ऐसा करने का एक तरीका है, बजाय व्यक्तिगत रिपोज के लिए? मेरा प्रश्न यहाँ देखें: stackoverflow.com/questions/21307793/…
scubbo

6
आज जारी किए गए अधिक अप-टू-डेट समाधान के लिए नीचे इस उत्तर को देखें Git 2.13
तेजसुबने

489

2.13 git के बाद से , इसे नए पेश किए गए सशर्त शामिल का उपयोग करके हल करना संभव है ।

एक उदाहरण:

वैश्विक विन्यास ~ / .itconfig

[user]
    name = John Doe
    email = john@doe.tld

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

कार्य विशिष्ट विन्यास ~ / काम / .itconfig

[user]
    email = john.doe@company.tld

48
यह अब तक का सबसे अच्छा उत्तर है कि git 2.13 जारी किया गया है।
तेजसबूबेन

1
क्या यह समाधान शामिल बयान में निर्दिष्ट सभी उपनिर्देशिकाओं के लिए काम करेगा, यह मानते हुए कि उनके पास स्वयं की कोई .gitconfig फाइलें नहीं हैं? मुझे लगता है कि ऐसा होता है, लेकिन अभी तक परीक्षण से यह पैदा नहीं हुआ है।
गैरी

2
@ जीरी, मेरे अनुभव और डॉक्स के अनुसार: “यदि पैटर्न / के साथ समाप्त होता है, तो ** स्वचालित रूप से जुड़ जाएगा। उदाहरण के लिए, पैटर्न फू / बन जाता है फू / **। दूसरे शब्दों में, यह "फू" और अंदर की सभी चीजों की पुनरावृत्ति करता है। ","; $ HOME / to / group के अंदर सभी रिपॉजिटरी के लिए शामिल करें [शामिल करें "gitdir: ~ / to / group /"] "
Tomáš Janoušek

6
Gitdir पिछले शामिल होना चाहिए '/'।
क्रिस यिम

5
आप देख सकते हैं कि यह git config --listअलग-अलग निर्देशिकाओं में चलकर पुनरावर्ती कार्य करता है । के उपनिर्देशिका ~/work/में एक git भंडार होता है, includeIfप्रभावी होता है। ध्यान दें कि उपनिर्देशिका ~/work/में एक गिट रिपॉजिटरी शामिल नहीं है, includeIfनिष्पादित नहीं किया गया है।
NZD

104

या आप अपनी स्थानीय .git/configफ़ाइल में निम्नलिखित जानकारी जोड़ सकते हैं

[user]  
    name = Your Name
    email = your.email@gmail.com

27
... जो करने के लिए @discomurray द्वारा सुझाए गए आदेशों को करने का मैनुअल तरीका है।
उपयोगकर्ता 456584

1
क्या रिमोट के अनुसार इस की कई लाइनें जोड़ना संभव है?
हाबिल कैलेजो जू

55

एक कमांड github खाते स्विच करते हैं

यह घोल एकल गिट उर्फ ​​का रूप लेता है। एक बार निष्पादित होने के बाद, वर्तमान प्रोजेक्ट उपयोगकर्ता किसी अन्य खाते से संलग्न हो जाएगा

Ssh कुंजी उत्पन्न करें

ssh-keygen -t rsa -C "rinquin.arnaud@gmail.com" -f '/Users/arnaudrinquin/.ssh/id_rsa'

[...]

ssh-keygen -t rsa -C "arnaud.rinquin@wopata.com" -f '/Users/arnaudrinquin/.ssh/id_rsa_pro'

उन्हें अपने GitHub / Bitbucket खातों से लिंक करें

  1. डिफ़ॉल्ट सार्वजनिक कुंजी की प्रतिलिपि बनाएँ pbcopy < ~/.ssh/id_rsa.pub
  2. अपने GitHub acount में लॉगिन करें
  3. add SSH keyजीथब पृष्ठ में कुंजी चिपकाएँ
  4. अन्य सार्वजनिक कुंजी कॉपी करें pbcopy < ~/.ssh/id_rsa_pro.pub
  5. हर दूसरे खाते के लिए चरण 2 से 4 दोहराएं और अनुकूलित करें

चरण 1. स्वचालित ssh कुंजी स्विचिंग।

हम sshएक विशिष्ट एन्क्रिप्शन कुंजी का उपयोग करने के लिए कॉन्फ़िगर कर सकते हैं host। अच्छी बात यह है कि आपके पास इसके लिए कई उपनाम हो सकते हैं hostname

इस उदाहरण ~/.ssh/configफ़ाइल को देखें :

# Default GitHub
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa

# Professional github alias
Host github_pro
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_pro

git दूरस्थ विन्यास

अब आप को बदलने के द्वारा Git रिमोट में इन अन्य नामों का उपयोग कर सकते git@github.comद्वारा git@github_pro

आप या तो अपनी मौजूदा परियोजनाओं के रिमोट को बदल सकते हैं (जैसे कुछ का उपयोग करके git remote set-url origin git@github_pro:foo/bar.git) या उन्हें क्लोन करने पर सीधे अनुकूलित कर सकते हैं।

git clone git@github.com:ArnaudRinquin/atom-zentabs.git

उपनाम का उपयोग करते हुए, यह बन गया:

git clone git@github_pro:ArnaudRinquin/atom-zentabs.git

चरण 2. परिवर्तन git user.email

Git config सेटिंग वैश्विक या प्रति प्रोजेक्ट हो सकती है। हमारे मामले में, हम प्रति प्रोजेक्ट सेटिंग चाहते हैं। इसे बदलना बहुत आसान है:

git config user.email 'arnaud.rinquin@wopata.com'

हालांकि यह आसान है, यह उन डेवलपर्स के लिए लंबे समय तक ले जाता है जो हम हैं। हम इसके लिए एक बहुत ही सरल git उपनाम लिख सकते हैं।

हम इसे ~/.gitconfigफ़ाइल में जोड़ने जा रहे हैं ।

[user]
    name = Arnaud Rinquin
    email = rinquin.arnaud@gmail.com

...

[alias]
    setpromail = "config user.email 'arnaud.rinquin@wopata.com'"

फिर, हमें केवल इतना करना है git setpromailकि इस परियोजना के लिए हमारे ईमेल को बदल दिया जाए।

चरण 3। एक आदेश स्विच कृपया !?

क्या एकल पैरामीटर-कम कमांड वाले डिफ़ॉल्ट खाते से निर्दिष्ट एक पर स्विच करना अच्छा नहीं होगा? यह निश्चित रूप से संभव है। इस कमांड के दो चरण होंगे:

  • वर्तमान परियोजना को बदलने के लिए चुने हुए उपनामों को दर्शाता है
  • वर्तमान प्रोजेक्ट user.email config बदलें

हमारे पास पहले से ही दूसरे चरण के लिए एक कमांड सॉल्यूशन है, लेकिन पहला रास्ता कठिन है। एक कमांड दूरस्थ होस्ट परिवर्तन

यहाँ एक और git उर्फ ​​कमांड के रूप में समाधान आपके पास जोड़ने के लिए आता है ~/.gitconfig:

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"

यह एक मेजबान से दूसरे (उपनाम) के लिए सभी रिमोट को बदलने की अनुमति देता है। उदाहरण देखें:

$ > git remote -v
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (push)

$ > git changeremotehost github.com github_pro

$ > git remote -v
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (push)

उन सभी को मिलाएं

अब हमें केवल दो कमांड को एक में मिलाना है, यह काफी आसान है। देखें कि मैं कैसे बिटबकेट होस्ट स्विचिंग को एकीकृत करता हूं।

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"
  setpromail = "config user.email 'arnaud.rinquin@wopata.com'"
  gopro = !sh -c \"git changeremotehost github.com github_pro && git changeremotehost bitbucket.com bitbucket_pro && git setpromail\"

स्रोत लिंक -Tutorial


यह शानदार है, धन्यवाद। मैं प्रति ईमेल repos का एक गुच्छा के साथ काम setpromailकरता हूं, इसलिए मेरा उपनाम config --globalइसके बजाय करता है (और मेरे पास विभिन्न ईमेल पते सेट करने के लिए अन्य सेट हैं)। यह काम करता हैं!
माइकल-स्लम

1
उन 2 अलग-अलग खातों के लिए मैं विभिन्न gpg कुंजियों के साथ कैसे हस्ताक्षर कर सकता हूं? मेरे पास 2x github खातों के लिए 2x gpg कुंजियाँ हैं और वे अलग तरह से हस्ताक्षर करना चाहेंगे। "git config --global user.signingkey xxxx"
hakkican

यह जवाब कमाल का है। मैंने लगभग इसे नहीं पढ़ा क्योंकि मुझे लगा कि मैंने दूसरे उत्तर से क्या पाया। निश्चित रूप से अधिक उत्थान के हकदार हैं। पुनश्च। useConfigOnly = trueदूसरे उत्तर से संयुक्त होने पर यह और भी बेहतर है ।
स्टीवनबोट

आइडेंटिफ़ाइल नहीं है, यह IdenfityFile है।
ईसाई

40

Orr Sella के ब्लॉग पोस्ट से कुछ प्रेरणा प्राप्त करने के बाद, मैंने एक प्री-कमिट हुक (रेजिड्स इन ~/.git/templates/hooks) लिखा, जो एक स्थानीय रिपॉजिटरी के अंदर की जानकारी के आधार पर विशिष्ट उपयोगकर्ता नाम और ई-मेल पते सेट करेगा ./.git/config:

आपको खाका निर्देशिका में पथ को अपने स्थान पर रखना होगा ~/.gitconfig:

[init]
    templatedir = ~/.git/templates

फिर प्रत्येक git initया git cloneकि हुक लेने जाएगा और अगले दौरान उपयोगकर्ता डेटा लागू होगी git commit। यदि आप हुक को पहले से ही हटाए गए रेपो पर लागू करना चाहते हैं, तो git initइसे पुन: व्यवस्थित करने के लिए रेपो के अंदर बस चलाएं ।

यहां वह हुक है जो मैं लेकर आया था (इसमें अभी भी कुछ चमकाने की जरूरत है - सुझावों का स्वागत है)। इसे या तो सहेजें

~/.git/templates/hooks/pre_commit

या

~/.git/templates/hooks/post-checkout

और यह सुनिश्चित करें कि यह निष्पादन योग्य है: chmod +x ./post-checkout || chmod +x ./pre_commit

#!/usr/bin/env bash

# -------- USER CONFIG
# Patterns to match a repo's "remote.origin.url" - beginning portion of the hostname
git_remotes[0]="Github"
git_remotes[1]="Gitlab"

# Adjust names and e-mail addresses
local_id_0[0]="my_name_0"
local_id_0[1]="my_email_0"

local_id_1[0]="my_name_1"
local_id_1[1]="my_email_1"

local_fallback_id[0]="${local_id_0[0]}"
local_fallback_id[1]="${local_id_0[1]}"


# -------- FUNCTIONS
setIdentity()
{
    local current_id local_id

    current_id[0]="$(git config --get --local user.name)"
    current_id[1]="$(git config --get --local user.email)"

    local_id=("$@")

    if [[ "${current_id[0]}" == "${local_id[0]}" &&
          "${current_id[1]}" == "${local_id[1]}" ]]; then
        printf " Local identity is:\n"
        printf "»  User: %s\n»  Mail: %s\n\n" "${current_id[@]}"
    else
        printf "»  User: %s\n»  Mail: %s\n\n" "${local_id[@]}"
        git config --local user.name "${local_id[0]}"
        git config --local user.email "${local_id[1]}"
    fi

    return 0
}

# -------- IMPLEMENTATION
current_remote_url="$(git config --get --local remote.origin.url)"

if [[ "$current_remote_url" ]]; then

    for service in "${git_remotes[@]}"; do

        # Disable case sensitivity for regex matching
        shopt -s nocasematch

        if [[ "$current_remote_url" =~ $service ]]; then
            case "$service" in

                "${git_remotes[0]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[0]}"
                    setIdentity "${local_id_0[@]}"
                    exit 0
                    ;;

                "${git_remotes[1]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[1]}"
                    setIdentity "${local_id_1[@]}"
                    exit 0
                    ;;

                * )
                    printf "\n»  pre-commit hook: unknown error\n» Quitting.\n"
                    exit 1
                    ;;

            esac
        fi
    done
else
    printf "\n»» An Intermission\n»  No remote repository set. Using local fallback identity:\n"
    printf "»  User: %s\n»  Mail: %s\n\n" "${local_fallback_id[@]}"

    # Get the user's attention for a second
    sleep 1

    git config --local user.name "${local_fallback_id[0]}"
    git config --local user.email "${local_fallback_id[1]}"
fi

exit 0

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

इसलिए मैंने पाइथन में हुक को हुक के रूप में लिखा और कमांड किया। इसके अतिरिक्त स्क्रिप्ट को Git कमांड ( git passport) के रूप में भी कॉल करना संभव है। इसके अलावा एक configfile ( ~/.gitpassport) जो एक संकेत पर चयन कर रहे हैं के अंदर आईडी की एक मनमानी संख्या को परिभाषित करना संभव है । आप github.com पर प्रोजेक्ट पा सकते हैं: git-passport - कई Git खातों / उपयोगकर्ता पहचान को प्रबंधित करने के लिए Python में लिखा गया Git कमांड और हुक


1
यह बड़े करीने से काम करता है। हालांकि, इसने पोस्ट-चेकआउट (पोस्ट-कमिट के बजाय) हुक बनाकर मेरे लिए बेहतर काम किया। इस उत्तर को बेहतर बनाने के लिए मेरे सुझाव हैं, इस बात का उल्लेख करें कि: 1. स्निपेट को ~ / .it / टेम्प्लेट / हुक / पोस्ट-चेकआउट के रूप में सहेजने की आवश्यकता है और उन्हें अनुमति दी जानी चाहिए chmod +x post-checkout, 2. git_remotesमान पूरे होस्टनाम के आरंभिक भाग हैं, जैसे git@github.com, 3. local_idमूल्यों को उपयोगकर्ता द्वारा संबंधित नाम और ईमेल पते पर संपादित किया जाना चाहिए।
शांतनु कुमार

@ शांतनुकुमार आपकी टिप्पणी के लिए धन्यवाद। जैसा कि आपने प्रस्तावित किया था मैंने उत्तर को समायोजित कर दिया। शायद मैं जल्द ही पायथन में स्क्रिप्ट दोबारा लिखूंगा।
सौसर

नियमित अभिव्यक्तियों के लिए और रेपोसेस के बिना रिपोजिटरी के लिए जोड़ा गया समर्थन। आसान डाउनलोड के लिए सभी यहाँ मर्ज किए गए हैं । एक ही सेवा पर विभिन्न परियोजनाओं के लिए पहचान को अलग करने के लिए Rexxps। और उदाहरण के लिए एक डिफ़ॉल्ट पहचान के साथ दूरस्थ रूप से रिपॉजिट का समर्थन करने से समझ में आता है कि क्या आप git initएक IDE से नई परियोजनाएं जैसे कि eclipse(जो इंटरएक्टिव प्री-कमिट ट्रिगर्स को संभाल नहीं सकते हैं)
cfi

25

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

(इच्छित) दोष यह है कि आपको हर रिपॉजिटरी के लिए एक बार अपना ईमेल पता (और अपना नाम) कॉन्फ़िगर करना होगा। इसलिए, आप इसे करना नहीं भूल सकते।

संस्करण <2.7.0

[user]
    name = Your name
    email = "(none)"

अपने वैश्विक विन्यास में ~/.gitconfigजैसा कि Orr Sella के ब्लॉग पोस्ट में डैन अलोनी की एक टिप्पणी में कहा गया है । जब रिपॉजिटरी में पहला कमिट करने की कोशिश की जाती है, तो अच्छा संदेश के साथ git विफल हो जाता है:

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '(none)')

नाम वैश्विक कॉन्फ़िगरेशन से लिया जाता है जब ईमेल पता स्थानीय रूप से सेट किया जाता है (संदेश पूरी तरह से सही नहीं है)।

2.7.0 ≤ संस्करण <2.8.0

संस्करणों में व्यवहार <2.7.0 का इरादा नहीं था और 2.7.0 के साथ तय किया गया था। आप अभी भी एक पूर्व-प्रतिबद्ध हुक का उपयोग कर सकते हैं जैसा कि ऑर्र सेला के ब्लॉग पोस्ट में वर्णित है । यह समाधान अन्य संस्करणों के लिए भी काम करता है, लेकिन अन्य समाधान इस संस्करण के लिए नहीं।

संस्करण .0 2.8.0

डैन अलोनी ने उस व्यवहार को प्राप्त करने के लिए एक विकल्प जोड़ा ( रिलीज नोट्स देखें )। इसके साथ प्रयोग करें:

[user]
    useConfigOnly = true

इसे काम करने के लिए आप वैश्विक कॉन्फ़िगरेशन में एक नाम या ईमेल पता नहीं दे सकते हैं। फिर, पहली बार में, आपको एक त्रुटि संदेश मिलता है

fatal: user.useConfigOnly set but no name given

इसलिए संदेश बहुत शिक्षाप्रद नहीं है, लेकिन चूंकि आपने विकल्प स्पष्ट रूप से निर्धारित किया है, इसलिए आपको पता होना चाहिए कि क्या करना है। संस्करणों के समाधान के विपरीत <2.7.0, आपको हमेशा नाम और ईमेल दोनों को मैन्युअल रूप से सेट करना होगा।


मैं कुछ महीनों के लिए इस पद्धति का उपयोग करता हूं, इसने बहुत अच्छा काम किया। मेरे पास कई ईमेल पते हैं (व्यक्तिगत, काम) और मैं वैश्विक gitconfig में एक "डिफ़ॉल्ट" कॉन्फ़िगर नहीं करना चाहता। विशेष मूल्य के साथ "(कोई नहीं)" गिट मुझे उपयोगकर्ता नाम और होस्टनाम (जो कष्टप्रद है और मुझे इसकी आवश्यकता है) के आधार पर अनुमान लगाने के बजाय एक नया रेपो स्पिन करने के लिए हर बार एक वैध पता प्रदान करने के लिए प्रेरित करेगा। हालांकि, हाल ही में जीआईटी (2.7.0, शायद पहले) के उन्नत संस्करण के साथ, मुझे लगता है कि विशेष मूल्य "(कोई नहीं)" घातक त्रुटियों को और अधिक ट्रिगर नहीं करता है। इसके बजाय यह सिर्फ "जॉन डो <(कोई नहीं)>" का उपयोग करेगा ...
ज़ूयुन वेई

@wzyboy: ओह, आप सही कह रहे हैं। मुझे git bisectलगता है कि 19ce497c प्रतिबद्ध था ... इस व्यवहार को पेश किया। हालांकि, संस्करण (2.5 - 2.7) से स्वतंत्र मैं email =विन्यास में (बिना किसी तर्क के) का उपयोग कर सकता हूं और यह email = "(none)"पुराने संस्करणों के समान व्यवहार दिखाता है । क्या आप इसकी पुष्टि कर सकते हैं? यदि हां, तो मैं अपना उत्तर संपादित करूंगा। मैं सिर्फ संदेहपूर्ण हूं क्योंकि यह इतना स्पष्ट है और मैंने पहले इसका उपयोग नहीं किया था।
जॉन

मैंने email =2.7.0 में कोशिश की , Git अभी भी उपयोगकर्ता नाम और होस्टनाम के आधार पर ईमेल पते का अनुमान लगाता है। अब मैं pre-commitSella के ब्लॉग में दृष्टिकोण का उपयोग करता हूं । मैंने डैन अलोनी को भी सूचित किया, जो "(none)"सेला के पद पर विचार के साथ आए थे और उन्होंने एक पैच को औपचारिक रूप से इसे एक सुविधा के रूप में लागू करने के लिए दायर किया: permalink.gmane.org/gmane.comp.version-control.git/285301
Zhuoyun Wei

3
चूंकि git-2.8: "user.useConfigOnly" कॉन्फ़िगरेशन चर का उपयोग उपयोगकर्ता को उपयोगकर्ता को हमेशा सेट करने के लिए बाध्य करने के लिए किया जा सकता है। उपयोगकर्ता और user.name github.com/git/git/blob/master/Documentation/RelNotes/2.8.0। txt
Rofrol

@rofrol जानकारी के लिए धन्यवाद। मैंने उसी हिसाब से अपना जवाब अपडेट किया।
जॉन

24

सशर्त के साथ Git 2.13 में शामिल है, अब एक मशीन पर कई उपयोगकर्ता / ईमेल सह-अस्तित्व के लिए बहुत कम काम करना संभव है।

user.gitconfigमेरा व्यक्तिगत नाम और ईमेल है work-user.gitconfigमेरे काम का नाम और ईमेल है दोनों फाइलें ~पथ पर हैं।

इसलिए मेरा व्यक्तिगत नाम / ईमेल डिफ़ॉल्ट रूप से लागू होता है। के लिए c:/work/निर्देशिका, मेरे काम नाम / ईमेल लागू किया जाता है। के लिए c:/work/github/निर्देशिका, मेरी व्यक्तिगत नाम / ईमेल लागू किया जाता है। अंतिम सेटिंग लागू होते ही यह काम करता है।

# ~/.gitconfig
[include]
    path = user.gitconfig
[includeIf "gitdir/i:c:/work/"]
    path = work-user.gitconfig
[includeIf "gitdir/i:c:/work/github/"]
    path = user.gitconfig

gitdirकेस-संवेदी है और gitdir/iकेस-असंवेदनशील है।

"gitdir/i:github/"सशर्त लागू करना होगा जिसमें githubइसके पथ के साथ कोई भी निर्देशिका शामिल हो ।


जबकि आपके उत्तर की सराहना की जाती है और आपके द्वारा 20 दिन पहले ही Tomáš Janoušek को वही दिया जाता है। कृपया इस उत्तर को हटाने पर विचार करें।
हेज

5
@ हेज हां, मैंने उनके उत्तर को गलत ठहराया, लेकिन मुझे विंडोज़ पर कॉन्फ़िगर करने में थोड़ा समय लगा और gitdir/iइससे मुझे मदद मिली (जिसमें उनके उत्तर का उल्लेख नहीं है)।
hipPy

जिस तरह से @hIpPy ने इसे सीधे मेरे उपयोग के मामले में लागू किया और इसे टॉमस के उत्तर की तुलना में अधिक आसान बना दिया। मैंने दोनों को उकसाया।
इसहाक एडम्स

18

gitकई नामों / ईमेलों के साथ काम करने का एक और विकल्प है , ग्लोबल और रिपॉजिटरी-विशिष्ट कॉन्फ़िगरेशन को ओवरराइड करने के gitलिए -cध्वज का उपयोग करके ।

उदाहरण के लिए, एक उपनाम को परिभाषित करके:

alias git='/usr/bin/git -c user.name="Your name" -c user.email="name@example.com"'

यह देखने के लिए कि क्या यह काम करता है, बस टाइप करें git config user.email:

$ git config user.email
name@example.com

एक उपनाम के बजाय, आप gitअपने भीतर एक कस्टम निष्पादन योग्य भी रख सकते हैं $PATH

#!/bin/sh
/usr/bin/git -c user.name="Your name" -c user.email="name@example.com" "$@"

एक रिपॉजिटरी-विशिष्ट पर इन पद्धति का एक फायदा .git/configयह है कि यह gitकस्टम gitप्रोग्राम के सक्रिय होने पर प्रत्येक रिपॉजिटरी पर लागू होता है। इस तरह, आप आसानी से किसी भी (साझा) कॉन्फ़िगरेशन को संशोधित किए बिना उपयोगकर्ताओं / नामों के बीच स्विच कर सकते हैं।


14

बचाव के लिए git उपनाम (और git configs में अनुभाग)!

एक उपनाम जोड़ें (कमांड लाइन से):

git config --global alias.identity '! git config user.name "$(git config user.$1.name)"; git config user.email "$(git config user.$1.email)"; :'

फिर, उदाहरण के लिए, सेट करें

git config --global user.github.name "your github username"
git config --global user.github.email your@github.email

और एक नए या क्लोन किए गए रेपो में आप इस कमांड को चला सकते हैं:

git identity github

यह समाधान स्वत: नहीं है, लेकिन unsetting उपयोगकर्ता और ईमेल अपने वैश्विक में ~/.gitconfigऔर स्थापित करने user.useConfigOnlyके लिए trueGit मजबूर होना पड़ा आप उन्हें प्रत्येक नए या क्लोन रेपो में मैन्युअल रूप से सेट करने के लिए याद दिलाने के लिए।

git config --global --unset user.name
git config --global --unset user.email
git config --global user.useConfigOnly true

1
मुझे आपका समाधान पसंद है; हालाँकि, जब मैं अपने वैश्विक को परेशान करता हूँ, तो यह मेरे कंप्यूटर के होस्ट के नाम के साथ कमिट करता है बजाय इसके कि मैं उन्हें किसी भी रेपो में सेट करने के लिए याद
दिलाऊँ

12

यहाँ कई उत्तर पढ़ने के बाद पूर्ण चरण दिए गए हैं

विभिन्न github खाते के लिए एकाधिक SSH कुंजी सेटिंग कैसे सेट करें

आप अपनी वर्तमान में सहेजी गई कुंजियों की जांच करना शुरू कर सकते हैं

$ ssh-add -l

यदि आप पहले सभी कैश्ड कुंजियों को हटाने का निर्णय लेते हैं ( वैकल्पिक, इस बारे में लापरवाह )

$ ssh-add -D

फिर आप प्रत्येक ईमेल / खाते से जुड़ी एक ssh पब / निजी कुंजी बना सकते हैं जिसे आप उपयोग करना चाहते हैं

$ cd ~/.ssh
$ ssh-keygen -t rsa -C "work@company.com" <-- save it as "id_rsa_work"
$ ssh-keygen -t rsa -C "pers@email.com" <-- save it as "id_rsa_pers"

इस आदेश को पूरा करने के बाद आपके पास निम्नलिखित फाइलें होंगी

~/.ssh/id_rsa_work      
~/.ssh/id_rsa_work.pub

~/.ssh/id_rsa_pers
~/.ssh/id_rsa_pers.pub 

सुनिश्चित करें कि प्रमाणीकरण एजेंट चल रहा है

$ eval `ssh-agent -s`

निम्नलिखित के रूप में उत्पन्न कुंजी जोड़ें (~ / .ssh फ़ोल्डर से)

$ ssh-add id_rsa_work
$ ssh-add id_rsa_pers

अब आप अपने सहेजे गए कुंजियों को फिर से जांच सकते हैं

$ ssh-add -l

अब आप की जरूरत है अपने GitHub / bickbuket सर्वर पहुंच कुंजी करने के लिए उत्पन्न सार्वजनिक कुंजी को जोड़ने के लिए

प्रत्येक फ़ोल्डर को अलग-अलग फ़ोल्डर में क्लोन करें

उस फ़ोल्डर पर जाएं जहां उपयोगकर्ता काम करेगा और इसे निष्पादित करेगा

$ git config user.name "Working Hard"
$ git config user.email "work@company.com" 

बस यह देखने के लिए कि यह ".it / config" की सामग्री की जाँच क्या करता है

फ़ोल्डर में जाएँ जहाँ उपयोगकर्ता व्यक्ति काम करते हैं और इस पर अमल होगा

$ git config user.name "Personal Account"
$ git config user.email "pers@email.com" 

बस यह देखने के लिए कि यह ".it / config" की सामग्री की जाँच क्या करता है

इस सब के बाद आप उन दो फ़ोल्डरों के बीच स्विच करके अपने व्यक्तिगत और काम कोड को करने में सक्षम होंगे

यदि आप Git Bash का उपयोग कर रहे हैं और Windows के अंतर्गत ssh कीज़ उत्पन्न करने की आवश्यकता है, तो इस चरणों का पालन करें:

https://support.automaticsync.com/hc/en-us/articles/202357115-Generating-an-SSH-Key-on-Windows


9

एक सरल उपाय है जो गलतियों से बचने के लिए अच्छा काम करता है।

बस [user]अपने सेक्शन को हटा दें ~/.gitconfig, जो आपको user.nameप्रत्येक रिपॉजिटरी के लिए सेटिंग किए बिना कोई भी कमिट करने से रोकेगा ।

अपने में ~/.bashrc, उपयोगकर्ता और ईमेल के लिए कुछ सरल उपनाम जोड़ें:

alias ggmail='git config user.name "My Name";git config user.email me@gmail.com'
alias gwork='git config user.name "My Name";git config user.email me@work.job'

महान कारण नहीं है कि आप हर git रेपो में विन्यास की नकल करेंगे
१०:४०

9

यह उत्तर आंशिक रूप से @Saucier द्वारा पोस्ट से प्रेरित है, लेकिन मैं रिमोट के आधार पर सेट करने के लिए user.nameऔर user.emailप्रति रेपो आधार पर स्वचालित तरीके की तलाश कर रहा था , जो कि गिट-पासपोर्ट पैकेज की तुलना में थोड़ा अधिक हल्का वजन था जो उन्होंने विकसित किया था । इसके अलावा h / t का उपयोग करने के लिए @JonConfigOnly सेटिंग करें। यहाँ मेरा समाधान है:

.gitconfig परिवर्तन:

[github]
    name = <github username>
    email = <github email>
[gitlab]
    name = <gitlab username>
    email = <gitlab email>
[init]
    templatedir = ~/.git-templates
[user]
    useConfigOnly = true

पोस्ट-चेकआउट हुक जिसे निम्न पथ पर सहेजा जाना चाहिए ~/.git-templates/hooks/post-checkout:

#!/usr/bin/env bash

# make regex matching below case insensitive
shopt -s nocasematch

# values in the services array should have a corresponding section in
# .gitconfig where the 'name' and 'email' for that service are specified
remote_url="$( git config --get --local remote.origin.url )"
services=(
    'github'
    'gitlab'
)

set_local_user_config() {
    local service="${1}"
    local config="${2}"
    local service_config="$( git config --get ${service}.${config} )"
    local local_config="$( git config --get --local user.${config} )"

    if [[ "${local_config}" != "${service_config}" ]]; then
        git config --local "user.${config}" "${service_config}"
        echo "repo 'user.${config}' has been set to '${service_config}'"
    fi
}

# if remote_url doesn't contain the any of the values in the services
# array the user name and email will remain unset and the
# user.useConfigOnly = true setting in .gitconfig will prompt for those
# credentials and prevent commits until they are defined
for s in "${services[@]}"; do
    if [[ "${remote_url}" =~ "${s}" ]]; then
        set_local_user_config "${s}" 'name'
        set_local_user_config "${s}" 'email'
        break
    fi
done

मैं github और gitlab के लिए अलग-अलग क्रेडेंशियल्स का उपयोग करता हूं, लेकिन ऊपर दिए गए कोड में उन संदर्भों को आपके द्वारा उपयोग की जाने वाली किसी भी सेवा के साथ बदला या संवर्धित किया जा सकता है। चेक-आउट हुक को स्वचालित रूप से उपयोगकर्ता नाम और ईमेल को स्थानीय रूप से एक रेपो के लिए सेट करने के बाद चेकआउट सुनिश्चित करें कि सेवा का नाम दूरस्थ url में दिखाई देता है, इसे post-checkoutस्क्रिप्ट में सेवाओं के सरणी में जोड़ें और इसके लिए एक अनुभाग बनाएं आपके पास .gitconfigउस सेवा के लिए आपका उपयोगकर्ता नाम और ईमेल है।

यदि कोई सेवा नाम दूरस्थ url में दिखाई नहीं देता है या रेपो में उपयोगकर्ता का रिमोट नहीं है और ईमेल स्थानीय रूप से सेट नहीं किया जाएगा। इन मामलों में user.useConfigOnlyसेटिंग खेल में होगी जो आपको उपयोगकर्ता नाम और ईमेल रेपो स्तर पर सेट होने तक कमिट करने की अनुमति नहीं देगा, और उपयोगकर्ता को उस जानकारी को कॉन्फ़िगर करने के लिए संकेत देगा।


1
महान समाधान। chmod 755हुक स्क्रिप्ट को मत भूलना । अन्यथा, इसे कॉपी किया जाएगा लेकिन कभी निष्पादित नहीं किया जाएगा।
onekiloparsec

5

GIT_AUTHOR_EMAIL + स्थानीय .bashrc

.bashrc_local: इस फ़ाइल को ट्रैक न करें, इसे केवल अपने काम के कंप्यूटर पर रखें:

export GIT_AUTHOR_EMAIL='me@work.com'
export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"

.bashrc: इस फ़ाइल को ट्रैक करें, इसे कार्य और होम कंप्यूटर दोनों पर समान करें:

F="$HOME/.bashrc_local"
if [ -r "$F" ]; then
    . "$F"
fi

मैं अपने डॉटफ़ाइल्स को सिंक करने के लिए https://github.com/technicalpickles/homesick का उपयोग कर रहा हूं ।

यदि केवल gitconfig पर्यावरण चर स्वीकार करेगा: git config में शेल चर विस्तार


5

विंडोज पर्यावरण

अतिरिक्त इससे संशोधित किया जा सकता है Git Extensions --> Settings --> Global Settings, यदि आपने इसे अपने सिस्टम में स्थापित किया है।

gitextensions-नवीनतम रिलीज

इन सेटिंग्स का उपयोग करने के लिए विंडोज पर्यावरण में एक फ़ोल्डर / निर्देशिका पर राइट क्लिक करें। यहां छवि विवरण दर्ज करें

अपडेट : संस्करण 2.49 में कई सेटिंग्स को कैसे स्विच / बनाए रखें संस्करण 2.49 में कई सेटिंग्स को कैसे स्विच / बनाए रखें


यह केवल संपादन करने के बजाय, एकाधिक उपयोगकर्ताओं को कैसे संबोधित करता है?

@D_N सेटिंग्स स्विच करने के विकल्पों के साथ नए स्क्रीनशॉट के साथ अपडेट किया गया।
अभिजीत

स्थानीय रेपो फ़ोल्डर खोलें और नेविगेशन मेनू से git-config का चयन करें, फिर स्थानीय रेपो टैब पर क्लिक करें, सामग्री को उपरोक्त उत्तर के रूप में $ local_repo_path / .git / config पर लागू किया जाएगा।
अधिकतम

3

शायद यह एक साधारण हैक है, लेकिन यह उपयोगी है। बस नीचे की तरह 2 ssh कीज उत्पन्न करें।

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/GowthamSai/.ssh/id_rsa): work
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in damsn.
Your public key has been saved in damsn.pub.
The key fingerprint is:
SHA256:CrsKDJWVVek5GTCqmq8/8RnwvAo1G6UOmQFbzddcoAY GowthamSai@Gowtham-MacBook-Air.local
The key's randomart image is:
+---[RSA 4096]----+
|. .oEo+=o+.      |
|.o o+o.o=        |
|o o o.o. +       |
| =.+ .  =        |
|= *+.   S.       |
|o*.++o .         |
|=.oo.+.          |
| +. +.           |
|.o=+.            |
+----[SHA256]-----+

उसी तरह से व्यक्तिगत के लिए एक और बनाएं। तो, आपके पास 2 ssh कीज़, काम और कंपनी है। कार्य को कॉपी करें। कार्य, कार्य, वैयक्तिक। पब, व्यक्तिगत से ~ /। Ssh / निर्देशिका तक।

फिर निम्नलिखित पंक्तियों के साथ एक शेल स्क्रिप्ट बनाएं और इसे निम्न सामग्री के साथ crev.sh (कंपनी रिवर्स) के रूप में नाम दें।

cp ~/.ssh/work ~/.ssh/id_rsa
cp ~/.ssh/work.pub ~/.ssh/id_rsa.pub

उसी तरह, निम्नलिखित सामग्री के साथ एक और प्रचलित .sh (व्यक्तिगत रिवर्स) बनाएं।

cp ~/.ssh/personal ~/.ssh/id_rsa
cp ~/.ssh/personal.pub ~/.ssh/id_rsa.pub

~ / .bashrc नीचे दिए गए जैसे स्क्रिप्ट के लिए उपनाम जोड़ते हैं

alias crev="sh ~/.ssh/crev.sh"
alias prev="sh ~/.ssh/prev.sh"
source ~/.bashrc

जब भी आप कंपनी का उपयोग करना चाहते हैं, तो बस crev करें, और यदि आप व्यक्तिगत उपयोग करना चाहते हैं तो prev: -p।

उन Ssh कुंजी को अपने GitHub खातों में जोड़ें। सुनिश्चित करें, आपके पास पहले से जनरेट किया गया id_rsa नहीं है, क्योंकि वे स्क्रिप्ट id_rsa को अधिलेखित कर देंगे। यदि आपने पहले ही id_rsa जनरेट कर लिया है, तो उस खाते के लिए उपयोग करें। उन्हें व्यक्तिगत रूप से कॉपी करें और व्यक्तिगत कुंजी की पीढ़ी को छोड़ दें।


1

मैंने एक बैश फंक्शन बनाया जो हैंडल करता है। यहाँ जीथुब रेपो है

रिकार्ड के लिए:

# Look for closest .gitconfig file in parent directories
# This file will be used as main .gitconfig file.
function __recursive_gitconfig_git {
    gitconfig_file=$(__recursive_gitconfig_closest)
    if [ "$gitconfig_file" != '' ]; then
        home="$(dirname $gitconfig_file)/"
        HOME=$home /usr/bin/git "$@"
    else
        /usr/bin/git "$@"
    fi
}

# Look for closest .gitconfig file in parents directories
function __recursive_gitconfig_closest {
    slashes=${PWD//[^\/]/}
    directory="$PWD"
    for (( n=${#slashes}; n>0; --n ))
    do
        test -e "$directory/.gitconfig" && echo "$directory/.gitconfig" && return 
        directory="$directory/.."
    done
}


alias git='__recursive_gitconfig_git'

1

इसे अपने ~ / .bash_profile पर github.com की डिफ़ॉल्ट कुंजियों के बीच स्विच करने के लिए जोड़ें

# Git SSH keys swap
alias work_git="ssh-add -D  && ssh-add -K ~/.ssh/id_rsa_work"
alias personal_git="ssh-add -D && ssh-add -K ~/.ssh/id_rsa"

1

आप git commit --author "Your Name <your@email.com>"एक रेपो में एक प्रतिबद्ध करने के क्षण में भी उपयोग कर सकते हैं जहां आप एक अलग उपयोगकर्ता के रूप में प्रतिबद्ध करना चाहते हैं।


0

रोब डब्ल्यू के जवाब की तरह कुछ है , लेकिन अलग-अलग ssh कुंजी को अलग करने की अनुमति देता है, और पुराने git संस्करणों के साथ काम करता है (जिसमें कोई core.sshCommand config नहीं है)।

मैंने ~/bin/git_poweruserनिष्पादन योग्य अनुमति और पथ में फ़ाइल बनाई :

#!/bin/bash

TMPDIR=$(mktemp -d)
trap 'rm -rf "$TMPDIR"' EXIT

cat > $TMPDIR/ssh << 'EOF'
#!/bin/bash
ssh -i $HOME/.ssh/poweruserprivatekey $@
EOF

chmod +x $TMPDIR/ssh
export GIT_SSH=$TMPDIR/ssh

git -c user.name="Power User name" -c user.email="power@user.email" $@

जब भी मैं "पावर यूजर" के रूप में कुछ करना या पुश करना चाहता हूं, तो मैं git_poweruserइसके बजाय उपयोग करता हूं git। यह किसी भी निर्देशिका पर काम करना चाहिए, और में परिवर्तन की आवश्यकता नहीं है .gitconfigया .ssh/configकम से कम खान में नहीं,।


0

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

  • .gitconfgअपने अन्य रेपो से मौजूदा कॉपी करें
  • अपने नए जोड़े गए रेपो में पेस्ट करें
  • .gitconfigफ़ाइल में मान बदलें , जैसे कि नाम, ईमेल और उपयोगकर्ता नाम [user] name = John email = john@email.net username = john133
  • .gitignoreसूची में फ़ाइल नाम जोड़ें , यह सुनिश्चित करने के लिए कि आप .gitconfigअपने काम के रेपो में फ़ाइल न करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.