.Gitconfig içinde kendim için birden fazla kullanıcı belirleyebilir miyim?


755

Benim ~/.gitconfig, kişisel e-posta adresimi altında listeliyorum [user], çünkü Github depoları için kullanmak istediğim şey bu.

Ama son zamanlarda git'i iş için kullanmaya başladım. Şirketimin git repo'su işlememe izin veriyor, ancak yeni değişiklik kümelerinin duyurularını gönderdiğinde, Anonim olduklarını söylüyor çünkü e-posta adresimi tanımıyor .gitconfig- en azından bu benim teorim.

İçinde birden fazla [user]tanım belirtmek mümkün mü .gitconfig? Veya .gitconfigbelirli bir dizin için varsayılanı geçersiz kılmanın başka bir yolu var mı? Benim durumumda, tüm çalışma kodunu kontrol ~/worksrc/- .gitconfigsadece bu dizin (ve alt dizinleri) için bir belirtmek için bir yolu var mı?



1
Şirket sunucunuzun bunu yapacağına şaşırdım - bunun çalışması için taahhüdünüzü değiştirmek zorunda kalacaksınız. Yerel bir ödeme işlemi yaparsanız, hangi kullanıcı adını görürsünüz?
Alex Brown

1
@Alex: Orada önemli olanı unuttum - bu sadece e-posta bildiriminde bir isim olabilir, aslında taahhütte hiçbir şeyi değiştirmez.
Cascabel

1
Bu yinelenen çalışmayı otomatikleştirmek için bir git-hook kullanabilirsiniz: github.com/DrVanScott/git-clone-init
Henning

1
Lütfen bu yanıtı kabul edin: stackoverflow.com/a/43654115/482899 . Git 2.13'ten bu yana en iyi çözüm.
northtree

Yanıtlar:


1017

Tek tek bir depolamayı, genel yapılandırmayı geçersiz kılan belirli bir kullanıcı / e-posta adresini kullanacak şekilde yapılandırabilirsiniz. Reponun kökünden, koş

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

oysa varsayılan kullanıcı / e-posta ~ / .gitconfig

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

83
bu ayarların etkilerini .git/configdosyada görebilirsiniz
Abizern

21
Bu yapılandırma dosyalarını git config --editve ile manuel olarak düzenleyebilirsiniz git config --global --edit. Abizern'in yorumunu kaçırmanız durumunda , bir deponun yapılandırma dosyası şuradadır <repo-root>/.git/config.
Rory O'Kane

13
Ayrıca yerel ayarları geçersiz kılacakları için GIT_AUTHOR_EMAIL ve GIT_COMMITTER_EMAIL (ve * _NAME) öğelerinin ayarını
kaldırmalısınız

6
Bunu tek tek depolar yerine belirli bir klasördeki tüm depolar için yapmanın bir yolu var mı? Soruma buradan bakın: stackoverflow.com/questions/21307793/…
scubbo

6
Bkz Aşağıda bu cevabı ile daha ye kadar güncel çözümü için Git 2.13piyasaya bugün.
tejasbubane

491

Git 2.13'ten bu yana , yeni tanıtılan Koşullu içerikler kullanarak bunu çözmek mümkündür .

Bir örnek:

Global yapılandırma ~ / .gitconfig

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

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

İşe özel yapılandırma ~ / iş / .gitconfig

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

48
Git 2.13'ün piyasaya sürülmesinin en iyi yanıtı bu.
tejasbubane

1
Bu çözüm, kendi .gitconfig dosyası olmadığını varsayarak, include deyiminde belirtilen alt dizinler için çalışır mı? Ben öyle düşünürdüm, ama şu ana kadar testler bunu gerçekleştirmedi.
Gary

2
@Gary Evet, tecrübelerime ve dokümanlara göre: “Desen / ile biterse ** otomatik olarak eklenecektir. Örneğin, foo / paterni foo / ** olur. Başka bir deyişle, "foo" ile ve içerideki her şeyle, yinelemeli olarak eşleşir. $ HOME / to / group içindeki tüm depolar için [includeIf "gitdir: ~ / to / group /"] ”
Tomáš Janoušek

6
Gitdir son içermelidir '/'.
Chris Yim

5
git config --listFarklı dizinlerde çalışarak yinelemeli çalışıp çalışmadığını kontrol edebilirsiniz . ~/work/Bir git deposu içeren alt dizinlerde, includeIfetkisi geçer. ~/work/Git deposu içermeyen alt dizinlerde, includeIfyürütülmediğini unutmayın.
NZD

105

Veya yerel .git/configdosyanıza aşağıdaki bilgileri ekleyebilirsiniz

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

27
... @discomurray tarafından önerilen komutların sizin için yapmasının manüel yoludur.
user456584

1
her uzaktan kumanda için birden fazla satır eklemek mümkün müdür?
Abel Callejo

55

Bir komut github hesapları anahtarı

Bu çözüm, tek bir git takma adı biçimini alır. Yürütüldüğünde, mevcut proje kullanıcısı başka bir hesaba eklenir

Ssh anahtarları üret

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'

Onları GitHub / Bitbucket hesaplarınıza bağlayın

  1. varsayılan ortak anahtarı kopyala pbcopy < ~/.ssh/id_rsa.pub
  2. GitHub hesabınıza giriş yapın
  3. anahtarı add SSH keygithub sayfasına yapıştır
  4. diğer ortak anahtarı kopyala pbcopy < ~/.ssh/id_rsa_pro.pub
  5. diğer tüm hesaplar için 2-4. adımları tekrarlayın ve uyarlayın

Adım 1. Otomatik ssh tuşu değiştirme.

sshÖğesine bağlı olarak belirli bir şifreleme anahtarı kullanmak üzere yapılandırabiliriz host. Güzel olan şey, bunun için birkaç takma adınız olabilir hostname.

Bu örnek ~/.ssh/configdosyaya bakın :

# 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 uzaktan yapılandırma

Artık değiştirerek git uzaktan kumanda bu takma adları kullanabilirsiniz git@github.comtarafından git@github_pro.

Mevcut proje uzaktan kumandalarınızı değiştirebilir (benzer bir şey kullanarak git remote set-url origin git@github_pro:foo/bar.git) veya klonlarken doğrudan uyarlayabilirsiniz.

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

takma ad kullanarak, olur:

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

Adım 2. git user.email öğesini değiştirme

Git yapılandırma ayarları genel veya proje başına olabilir. Bizim durumumuzda, proje başına ayarlar istiyoruz. Bunu değiştirmek çok kolay:

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

Bu kolay olsa da, olduğumuz geliştiriciler için özlem ister. Bunun için çok basit bir git takma adı yazabiliriz.

~/.gitconfigDosyaya ekleyeceğiz .

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

...

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

Ardından, tek yapmamız gereken git setpromaile-postamızın sadece bu proje için değiştirilmesini sağlamaktır.

Adım 3. Bir komut anahtarı lütfen ?!

Tek bir parametresiz komutla varsayılan hesaptan belirli bir hesaba geçmek hoş olmaz mıydı? Bu kesinlikle mümkün. Bu komutun iki adımı olacaktır:

  • mevcut proje kumandalarını seçilen takma adlarla değiştir
  • mevcut projeyi değiştir user.email config

İkinci adım için zaten tek bir komut çözümümüz var, ancak birincisi çok daha zor. Bir komut uzak ana bilgisayar değişikliği

İşte çözüm eklemek için başka bir git alias komutu şeklinde çözüm geliyor ~/.gitconfig:

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

Bu, tüm uzaktan kumandaların bir ana bilgisayardan diğerine (takma ad) değiştirilmesine izin verir. Örneğe bakın:

$ > 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)

Hepsini birleştirin

Şimdi iki komutu bir araya getirmemiz gerekiyor, bu oldukça kolay. Bitbucket ana bilgisayar anahtarlamasını nasıl entegre ettiğimi görün.

[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\"

Kaynak Bağlantısı - Eğitim


Bu harika, teşekkürler. setpromailTakma adım config --globalyerine bir e-posta başına bir sürü depo ile çalışıyorum (ve farklı e-posta adresleri ayarlamak için başka ayarlanmış takma adlar var). İşe yarıyor!
michel-slm

1
Bu 2 farklı hesap için farklı gpg anahtarlarıyla nasıl oturum açabilirim? 2x github hesapları için 2x gpg anahtarları var ve farklı imzalamak istiyorum. "git config --global user.signingkey xxxx"
hakkican

Bu cevap harika. Neredeyse okumadım çünkü diğer cevaptan ne bulduğumu düşündüm. Kesinlikle daha fazla oy hak ediyor. PS. useConfigOnly = trueDiğer cevaptan birleştirildiğinde daha da iyidir .
steinybot

IdentifyFile değil, IdenfityFile.
Christian

40

Orr Sella'nın blog gönderisinden biraz ilham aldıktan sonra ~/.git/templates/hooks, yerel bir deponun içindeki bilgilere dayanarak belirli kullanıcı adlarını ve e-posta adreslerini ayarlayan bir ön taahhüt kancası (içinde bulunur ) yazdım ./.git/config:

Şablon dizininin yolunu şu adrese yerleştirmeniz gerekir ~/.gitconfig:

[init]
    templatedir = ~/.git/templates

Daha sonra her git initveya git clonebu kancayı alır ve bir sonraki sırada kullanıcı verilerini uygular git commit. Kancayı zaten mevcut olan depolara uygulamak istiyorsanız git init, yeniden başlatmak için deponun içinde bir tane çalıştırın .

İşte ben geldi kanca (hala bazı parlatma ihtiyacı - önerilerinizi bekliyoruz). Farklı kaydet

~/.git/templates/hooks/pre_commit

veya

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

ve çalıştırılabilir olduğundan emin olun: 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

DÜZENLE:

Bu yüzden kancayı Python'da bir kanca ve komut olarak yeniden yazdım. Ayrıca betiği Git komutu ( git passport) olarak da çağırmak mümkündür . Ayrıca ~/.gitpassport, komut isteminde seçilebilen bir configfile ( ) içinde rasgele sayıda kimlik tanımlamak da mümkündür . Projeyi github.com adresinde bulabilirsiniz: git-passport - Birden fazla Git hesabını / kullanıcı kimliğini yönetmek için Python'da yazılmış bir Git komutu ve kancası .


1
Bu düzgün çalışıyor. Ancak, bu bir ödeme sonrası (yerine taahhüt) kanca yaparak benim için daha iyi çalıştı. Bu yanıtı geliştirmek için önerilerim şöyledir: 1. snippet'in ~ / .git / templates / kancalar / ödeme sonrası olarak kaydedilmesi ve izin verilmesi gerekir chmod +x post-checkout, 2. git_remotesdeğerler tüm ana bilgisayar adının başlangıç ​​bölümüdür, ör git@github.com. 3. local_iddeğerler kullanıcı tarafından ilgili adlara ve e-posta adreslerine düzenlenmelidir.
Shantanu Kumar

@ShantanuKumar Yorumunuz için teşekkür ederiz. Cevabı önerdiğin gibi ayarladım. Belki yakında Python'daki senaryoyu yeniden yazacağım.
Saucier

Düzenli ifadeler ve uzaktan kumandasız depolar için destek eklendi. Kolay indirme için hepsi burada birleştirildi . Aynı hizmetteki farklı projelerin kimliklerini ayırt etmek için normal ifadeler. Örneğin git init, bir IDE'den eclipse(interaktif ön taahhüt tetikleyicilerini işleyemeyen) yeni projeleriniz varsa, örneğin varsayılan bir kimlikle uzaktan depoları desteklemek mantıklıdır
cfi

25

Varsayılan bir e-posta adresine ( github kullanıcısına e-posta adresi bağlantıları ) sahip olmak istemiyorsanız, sorulmasını istediğinizi yapılandırabilirsiniz. Bunu nasıl yapabileceğiniz, kullandığınız git sürümüne bağlıdır, aşağıya bakın.

(Amaçlanan) dezavantajı, her depo için e-posta adresinizi (ve adınızı) bir kez yapılandırmanız gerektiğidir. Yani, yapmayı unutamazsın.

Sürüm <2.7.0

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

~/.gitconfigDan Aloni'nin Orr Sella'nın blog gönderisine yaptığı yorumda belirtildiği gibi global yapılandırmanızda . Bir depoda ilk taahhüdü yapmaya çalışırken, git güzel mesajla başarısız olur:

*** 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)')

E-posta adresi yerel olarak ayarlandığında ad global yapılandırmadan alınır (mesaj tam olarak doğru değildir).

2.7.0 ≤ Sürüm <2.8.0

2.7.0 sürümündeki davranışlar 2.7.0 ile tasarlanmamış ve düzeltilmemiştir. Yine de Orr Sella'nın blog gönderisinde açıklandığı gibi bir ön taahhüt kancası kullanabilirsiniz . Bu çözüm diğer sürümler için de geçerlidir, ancak diğer sürümler bu sürüm için geçerli değildir.

Sürüm ≥ 2.8.0

Dan Aloni bu davranışı elde etmek için bir seçenek ekledi (bkz. Sürüm notları ). Şununla kullanın:

[user]
    useConfigOnly = true

Çalışması için genel yapılandırmada bir ad veya e-posta adresi veremeyebilirsiniz. Ardından, ilk işlemde bir hata mesajı alırsınız

fatal: user.useConfigOnly set but no name given

Bu yüzden mesaj çok öğretici değil, ancak seçeneği açıkça ayarladığınızdan, ne yapacağınızı bilmelisiniz. 2.7.0 sürümünden farklı olarak, her zaman hem ad hem de e-postayı manuel olarak ayarlamanız gerekir.


Bu yöntemi birkaç ay boyunca kullanıyorum, harika çalıştı. Birden çok e-posta adresim var (kişisel, iş) ve genel gitconfig'de yapılandırılmış bir "varsayılan" adres istemiyorum. Özel değer "(yok)" git ile kullanıcı adı ve ana bilgisayar adı (bu can sıkıcı ve ben değiştirmek gerekir) dayalı bir tahmin tahmin yerine, her yeni bir repo spin her zaman geçerli bir adres sağlamak için beni isteyecektir. Ancak, son zamanlarda Git'in yükseltilmiş sürümünde (2.7.0, belki daha önce), özel değer "(yok)" artık ölümcül hataları tetiklemiyor. Bunun yerine "John Doe <(none)>" olduğu gibi kullanır ...
Zhuoyun Wei

@wzyboy: Oh, haklısın. Kullandığım git bisectişlemek bulmak için ... 19ce497c bu davranışı tanıtıldı. Ancak, (2.5 - 2.7) sürümünden bağımsız olarak ben email =yapılandırmada (argüman olmadan) kullanabilirim ve email = "(none)"eski sürümlerde olduğu gibi aynı davranışı gösterir . Bunu onaylayabilir misin? Eğer öyleyse cevabımı düzenleyeceğim. Çok açık gözüktüğü için daha şüpheliyim ve daha önce kullanmadım.
John

email =2.7.0'da denedim , Git hala kullanıcı adı ve ana bilgisayar adına göre e-posta adresini tahmin ediyor. Şimdi pre-commitSella'nın blogunda yaklaşımı kullanıyorum . Ayrıca "(none)"
Sella'nın gönderisindeki fikri ortaya çıkaran Dan Aloni'yi

3
git-2.8'den beri: "user.useConfigOnly" yapılandırma değişkeni, kullanıcıyı her zaman user.email & user.name github.com/git/git/blob/master/Documentation/RelNotes/2.8.0 olarak
rofrol

@rofrol Bilgi için teşekkürler. Cevabımı buna göre güncelledim.
John

24

İle koşullu içeren Git 2.13 yılında, çok az çalışma ile bir makinede birden fazla kullanıcı / e-posta aynı anda var olması artık mümkün.

user.gitconfigkişisel adım ve e-posta adresim var. work-user.gitconfigiş adım ve e-posta adresim var. Her iki dosya da ~yoltadır.

Kişisel adım / e-postam varsayılan olarak geçerlidir. c:/work/Dir için iş adım / e-posta adresim uygulandı. c:/work/github/Dir için kişisel adım / e-posta adresim uygulandı. Bu, son ayar uygulandığında çalışır.

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

gitdirbüyük / küçük harfe duyarlıdır ve gitdir/ibüyük / küçük harfe duyarlı değildir.

"gitdir/i:github/"githubyolundaki herhangi bir dizin için koşullu kapsamı uygular .


Cevabınız takdir edilirken ve iyi Tomáš Janoušek sizden 20 gün önce aynı şeyi verdi. Lütfen bu yanıtı silmeyi düşünün.
Hedge

5
@Hedge Evet, cevabını iptal ettim, ama pencerelerde yapılandırmak biraz zaman aldı ve burası gitdir/ibana yardımcı oldu (cevabından bahsetmiyor).
hIpPy

@HIpPy'nin bunu doğrudan kullanım durumuma uyguladığı ve Tomas'ın cevabından daha kolay takip etmesini sağladı. İkisini de iptal ettim.
Isaac Adams

18

gitBirden çok ad / e-posta ile çalışmaya başlamak için başka bir seçenek , genel ve depoya özgü yapılandırmayı geçersiz kılmak için bayrağı yumuşatmak gitve kullanmaktır -c.

Örneğin, bir takma ad tanımlayarak:

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

Çalışıp çalışmadığını görmek için şunu yazın git config user.email:

$ git config user.email
name@example.com

Takma ad yerine, özel bir gityürütülebilir dosya da içine koyabilirsiniz $PATH.

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

Bu yöntemin havuza özel bir avantajı , özel program etkin olduğunda .git/configher githavuz için geçerli gitolmasıdır. Bu şekilde, herhangi bir (paylaşılan) yapılandırmayı değiştirmeden kullanıcılar / adlar arasında kolayca geçiş yapabilirsiniz.


14

Git takma adları (ve git configs içindeki bölümler) kurtarmaya!

takma ad ekle (komut satırından):

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

sonra, örneğin ayarlayın

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

ve yeni veya klonlanmış bir repoda şu komutu çalıştırabilirsiniz:

git identity github

Bu çözüm otomatik değildir, ancak genelinizdeki kullanıcı ve e-postayı ~/.gitconfigayarlamak ve ayarlamak user.useConfigOnly, truegit'i her yeni veya klonlanmış repoda manuel olarak ayarlamanızı hatırlatmaya zorlar.

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

1
Çözümünü seviyorum; Ancak, benim küresel unset zaman sadece git herhangi bir repo onları ayarlamak hatırlatmak yerine bilgisayar ana bilgisayar adı ile taahhüt yapar :(
ENG618

12

Burada birçok cevabı okuduktan sonra tam adımlar

Farklı github hesabı için Çoklu SSH Anahtarları ayarları nasıl yapılır

Şu anda kaydedilmiş anahtarlarınızı kontrol etmeye başlamak isteyebilirsiniz

$ ssh-add -l

Önbelleğe alınan tüm anahtarları daha önce silmeye karar verirseniz ( isteğe bağlı, buna dikkat edin )

$ ssh-add -D

Ardından, kullanmak istediğiniz / kullanmak istediğiniz her e-postaya / hesaba bağlı bir ssh pub / priv anahtarı oluşturabilirsiniz

$ 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"

Bu komutları gerçekleştirdikten sonra aşağıdaki dosyalar oluşturulacak

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

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

Kimlik doğrulama aracısının çalıştığından emin olun

$ eval `ssh-agent -s`

Oluşturulan anahtarları aşağıdaki gibi ekleyin (~ / .ssh klasöründen)

$ ssh-add id_rsa_work
$ ssh-add id_rsa_pers

Şimdi kayıtlı anahtarlarınızı tekrar kontrol edebilirsiniz

$ ssh-add -l

Şimdi oluşturulan ortak anahtarları github / bickbuket sunucunuza eklemeniz gerekiyor Acces Keys

Depoların her birini farklı klasörlere kopyalayın

Kullanıcının çalışacağı klasöre gidin ve bunu yürütün

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

Bunun ne olduğunu görmek için ".git / config" içeriğini kontrol edin

Kullanıcı nerede klasöre gidin pers çalışmak ve bu çalıştırır

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

Bunun ne olduğunu görmek için ".git / config" içeriğini kontrol edin

Tüm bunlardan sonra, sadece bu iki klasör arasında geçiş yaparak kişisel ve iş kodunuzu verebileceksiniz.

Git Bash kullanıyorsanız ve Windows altında ssh anahtarları oluşturmanız gerekiyorsa şu adımları izleyin:

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


9

Hatalardan kaçınmak için iyi işleyen basit bir çözüm var.

Her depo için ayarlama yapmadan herhangi bir taahhütte bulunmanızı engelleyecek olan [user]bölümü kendinizden kaldırmanız yeterlidir .~/.gitconfiguser.name

Gözlerinde farklı ~/.bashrc, kullanıcı ve e-posta için bazı basit takma adları ekleyin:

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'

Büyük değil çünkü her git repo yapılandırmasını
çoğaltacaksınız

9

Bu cevap kısmen @Saucier tarafından göreve esinlenmiştir ama sete otomatik bir yol arıyordu user.nameve user.emailonun geliştirdiği git-pasaport paketinin biraz daha hafif olan uzaktan dayalı bir repo bazında . Ayrıca useConfigOnly ayarı için h / t ila @ John ayarı. İşte benim çözümüm:

.gitconfig değişiklikleri:

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

Aşağıdaki yola kaydedilmesi gereken çıkış sonrası kancası~/.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 ve gitlab için farklı kimlik bilgileri kullanıyorum, ancak yukarıdaki koddaki bu referanslar, kullandığınız herhangi bir hizmetle değiştirilebilir veya artırılabilir. Ödeme sonrasında kanca, kullanıcı adının ve e-postanın bir repo için yerel olarak yerel olarak ayarlanmasını sağlamak için, hizmet adının uzak URL'de göründüğünden emin olun, post-checkoutkomut dosyasındaki services dizisine ekleyin ve bunun için bir bölüm oluşturun senin .gitconfigo hizmet için kullanıcı adı ve e-posta içeriyor.

Uzak url'de hizmet adlarından hiçbiri görünmüyorsa veya depoda uzaktan kumanda yoksa kullanıcı adı ve e-posta yerel olarak ayarlanmayacaktır. Bu durumlarda, user.useConfigOnlykullanıcı adı ve e-posta repo düzeyinde ayarlanana kadar taahhütte bulunmanıza izin vermeyecek ve kullanıcıdan bu bilgileri yapılandırmasını isteyecek olan ayar geçerli olacaktır.


1
Harika bir çözüm. chmod 755Kanca komut dosyasını unutmayın . Aksi takdirde kopyalanacaktır ancak hiçbir zaman yürütülmeyecektir.
onekiloparsec

5

GIT_AUTHOR_EMAIL + yerel .bashrc

.bashrc_local: bu dosyayı takip etmeyin, sadece iş bilgisayarınıza koyun:

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

.bashrc: bu dosyayı izleyin, hem iş hem de ev bilgisayarlarında aynı yapın:

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

Dotfiles'imi senkronize etmek için https://github.com/technicalpickles/homesick kullanıyorum .

Yalnızca gitconfig ortam değişkenlerini kabul ederse: git config'te kabuk değişkeni genişletmesi


5

Windows Ortamı

Ek olarak Git Extensions --> Settings --> Global Settings, sisteminize yüklediyseniz, bu ayardan değiştirilebilir .

gitextensions-son sürüm

Bu ayarlara erişmek için Windows Ortamında bir klasöre / dizine sağ tıklayın. resim açıklamasını buraya girin

Güncelleme : Sürüm 2.49'da birden çok ayar nasıl değiştirilir / korunur Sürüm 2.49'da birden çok ayar nasıl değiştirilir / korunur


Bu, yalnızca onları düzenlemek yerine birden fazla kullanıcıya nasıl hitap eder?

@D_N Ayarları değiştirme seçenekleri içeren yeni ekran görüntüsü ile güncellendi.
Abhijeet

Yerel repo klasörünü açın ve gezinme menüsünden git-config'i seçin, ardından yerel repo sekmesine tıklayın, içerikler yukarıdaki yanıtta olduğu gibi $ local_repo_path / .git / config'e uygulanacaktır.
maxwu

3

Belki basit bir hack'tir, ama faydalıdır. Sadece aşağıdaki gibi 2 ssh anahtarı oluşturun.

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]-----+

Aynı şekilde kişisel için bir tane daha oluşturun. Yani, 2 ssh anahtarınız var, iş ve şirket. Work.pub, work, personal.pub, personal dosyasını ~ / .ssh / Directory dizinine kopyalayın .

Ardından, aşağıdaki satırları içeren bir kabuk komut dosyası oluşturun ve aşağıdaki içerikle crev.sh (Company Reverse) olarak adlandırın.

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

Aynı şekilde, aşağıdaki içeriğe sahip prev.sh (Kişisel Ters) adlı bir ad daha oluşturun.

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

~ / .bashrc gibi aşağıdaki komut dosyaları için takma adlar ekleyin

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

Şirket kullanmak istediğinizde, sadece crev yapın ve kişisel kullanmak istiyorsanız prev :-p yapın.

Bu ssh anahtarlarını GitHub hesaplarınıza ekleyin. Daha önce id_rsa'nızın oluşturulmadığından emin olun, çünkü bu komut dosyaları id_rsa'nın üzerine yazılır. Daha önce id_rsa oluşturduysanız, bunu hesaplardan biri için kullanın. Bunları kişisel olarak kopyalayın ve kişisel anahtarların oluşturulmasını atlayın.


1

Bunu idare eden bir bash işlevi yaptım. İşte Github repo .

Rekor için:

# 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

Github.com varsayılan anahtarları arasında geçiş yapmak için bunu ~ / .bash_profile dosyasına eklemeniz yeterlidir.

# 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

Ayrıca git commit --author "Your Name <your@email.com>"farklı bir kullanıcı olarak taahhütte bulunmak istediğiniz bir repoda taahhütte bulunduğunuzda da kullanabilirsiniz .


0

Rob W'nin cevabı gibi bir şey , ancak farklı bir farklı ssh anahtarına izin veriyor ve eski git sürümleriyle (örneğin bir core.sshCommand yapılandırması yok) çalışıyor.

Dosyayı ~/bin/git_poweruseryürütülebilir izinle oluşturdum ve PATH'de:

#!/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" $@

Ne zaman "Uzman Kullanıcı" olarak bir şey taahhüt etmek veya itmek istersem git_poweruserbunun yerine kullanıyorum git. Herhangi dizinde çalışması gerekir ve değişiklikleri gerektirmeyen .gitconfigveya .ssh/configen azından değil benimkinde.


0

Her ne kadar çoğu soru OP'yi cevaplasa da, sadece kendimden geçmek zorunda kaldım ve googling bile olmadan en hızlı ve en basit çözümü bulabildim. İşte basit adımlar:

  • .gitconfgdiğer repodan mevcut kopya
  • yeni eklenen repoya yapıştır
  • .gitconfigdosyadaki ad, e-posta ve kullanıcı adı gibi değerleri değiştirme [user] name = John email = john@email.net username = john133
  • için dosya adını ekleyin .gitignoreemin olmak için size taahhüt yok, listede .gitconfigçalışma repo dosyayı
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.