Czy w .gitconfig mogę określić wielu użytkowników dla siebie?

754

Na mojej ~/.gitconfigliście podam mój osobisty adres e-mail [user], ponieważ właśnie tego chcę używać do repozytoriów Github.

Ale ostatnio zacząłem używać git również do pracy. Repozytorium git mojej firmy pozwala mi na zatwierdzenie, ale kiedy wysyła ogłoszenia o nowych zestawach zmian, mówi, że pochodzą one od Anonimowego, ponieważ nie rozpoznaje adresu e-mail w moim .gitconfig- przynajmniej taka jest moja teoria.

Czy można podać wiele [user]definicji w .gitconfig? A może jest jakiś inny sposób na zastąpienie wartości domyślnej .gitconfigokreślonego katalogu? W moim przypadku sprawdzam cały kod pracy ~/worksrc/- czy istnieje sposób na określenie .gitconfigtylko dla tego katalogu (i jego podkatalogów)?

Brock Boland
źródło
Zobacz git-config # PLIKI .
Josh Lee
1
Dziwię się, że serwer twojej firmy to zrobiłby - musiałby ZMIEŃ sha twojego zatwierdzenia, aby to zadziałało. Jeśli zrobisz zatwierdzenie do lokalnej kasy, jaką nazwę użytkownika widzisz?
Alex Brown,
1
@Alex: Zapomniałem ważnego fragmentu - może to być po prostu nazwa w powiadomieniu e-mail, nie zmieniając niczego w zatwierdzeniu.
Cascabel,
1
Możesz użyć git-hook, aby zautomatyzować tę powtarzającą się pracę: github.com/DrVanScott/git-clone-init
Henning
1
Zaakceptuj tę odpowiedź: stackoverflow.com/a/43654115/482899 . To najlepsze rozwiązanie od gita 2.13.
northtree

Odpowiedzi:

1016

Możesz skonfigurować indywidualne repozytorium, aby używało określonego użytkownika / adresu e-mail, który zastępuje konfigurację globalną. Z katalogu głównego repozytorium uruchom

git config user.name "Your Name Here"
git config user.email [email protected]

podczas gdy domyślny użytkownik / e-mail jest skonfigurowany w twoim ~ / .gitconfig

git config --global user.name "Your Name Here"
git config --global user.email [email protected]
dyskomfort
źródło
83
efekty tych ustawień można zobaczyć w .git/configpliku
Abizern
21
Możesz ręcznie edytować te pliki konfiguracyjne przy pomocy git config --editi git config --global --edit. W przypadku pominięcia komentarza Abizern , plik konfiguracyjny repozytorium znajduje się pod adresem <repo-root>/.git/config.
Rory O'Kane,
13
Powinieneś także wyłączyć GIT_AUTHOR_EMAIL i GIT_COMMITTER_EMAIL (i * _NAME), ponieważ zastąpią one ustawienia lokalne
ACykliczny
6
Czy można to zrobić dla wszystkich repozytoriów w danym folderze, a nie dla pojedynczych repozytoriów? Zobacz moje pytanie tutaj: stackoverflow.com/questions/21307793/…
scubbo
6
Zobacz tę odpowiedź poniżej, aby uzyskać bardziej aktualne rozwiązanie z Git 2.13wydanym dzisiaj.
tejasbubane
489

Od wersji 2.13 możliwe jest rozwiązanie tego problemu za pomocą nowo wprowadzonych Uwarunkowań warunkowych .

Przykład:

Globalna konfiguracja ~ / .gitconfig

[user]
    name = John Doe
    email = [email protected]

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

Konfiguracja specyficzna dla pracy ~ / work / .gitconfig

[user]
    email = [email protected]
Tomáš Janoušek
źródło
48
To najlepsza odpowiedź teraz, gdy git 2.13 został wydany.
tejasbubane
1
Czy to rozwiązanie będzie działać dla wszystkich podkatalogów w obrębie tego określonego w instrukcji include, zakładając, że nie mają własnych plików .gitconfig? Tak mi się wydaje, ale jak dotąd testy tego nie potwierdziły.
Gary
2
@ Gary Tak, zgodnie z moim doświadczeniem i dokumentami: „Jeśli wzór kończy się na /, ** zostanie automatycznie dodany. Na przykład wzór foo / staje się foo / **. Innymi słowy, rekurencyjnie pasuje do „foo” i wszystkiego w środku. ”,„; dołącz do wszystkich repozytoriów wewnątrz $ HOME / to / group [includeIf "gitdir: ~ / to / group /"] ”
Tomáš Janoušek
6
Gitdir powinny zawierać ostatni „/”.
Chris Yim,
5
Możesz sprawdzić, czy działa rekurencyjnie, uruchamiając git config --listw różnych katalogach. W podkatalogach ~/work/zawierających repozytorium git includeIfobowiązuje. Zauważ, że w podkatalogach ~/work/, które nie zawierają repozytorium git, includeIfnie jest ono wykonywane.
NZD,
104

Lub możesz dodać następujące informacje do .git/configpliku lokalnego

[user]  
    name = Your Name
    email = [email protected]
Rahul Prasad
źródło
27
... który jest ręcznym sposobem wykonywania poleceń polecanych przez @discomurray.
user456584,
1
czy można dodać wiele linii tego na pilota?
Abel Callejo
55

Jedno polecenie przełącza konta github

To rozwiązanie ma postać pojedynczego aliasu git. Po wykonaniu bieżący użytkownik projektu zostanie przyłączony do innego konta

Wygeneruj klucze ssh

ssh-keygen -t rsa -C "[email protected]" -f '/Users/arnaudrinquin/.ssh/id_rsa'

[...]

ssh-keygen -t rsa -C "[email protected]" -f '/Users/arnaudrinquin/.ssh/id_rsa_pro'

Połącz je ze swoimi kontami GitHub / Bitbucket

  1. skopiuj domyślny klucz publiczny pbcopy < ~/.ssh/id_rsa.pub
  2. zaloguj się do konta GitHub
  3. wklej klucz na add SSH keystronie github
  4. skopiuj inny klucz publiczny pbcopy < ~/.ssh/id_rsa_pro.pub
  5. powtórz i dostosuj kroki od 2 do 4 dla każdego innego konta

Krok 1. Automatyczne przełączanie klucza ssh.

Możemy skonfigurować sshwysyłanie użycia określonego klucza szyfrowania w zależności od host. Fajną rzeczą jest to, że możesz mieć kilka aliasów dla tego samegohostname .

Zobacz ten przykładowy ~/.ssh/configplik:

# 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

zdalna konfiguracja git

Możesz teraz używać tych aliasów w pilotach git, zmieniając [email protected]według git@github_pro.

Możesz zmienić istniejące piloty projektów (używając czegoś podobnego git remote set-url origin git@github_pro:foo/bar.git) lub dostosować je bezpośrednio podczas klonowania.

git clone [email protected]:ArnaudRinquin/atom-zentabs.git

przy użyciu aliasu staje się:

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

Krok 2. Zmiana adresu e-mail git user.email

Ustawienia konfiguracji Git mogą być globalne lub dla jednego projektu. W naszym przypadku chcemy ustawienia dla każdego projektu. Bardzo łatwo to zmienić:

git config user.email '[email protected]'

Choć jest to łatwe, trzeba długo czekać na to, kim jesteśmy programiści. Możemy do tego napisać bardzo prosty alias git.

Dodamy go do ~/.gitconfigpliku.

[user]
    name = Arnaud Rinquin
    email = [email protected]

...

[alias]
    setpromail = "config user.email '[email protected]'"

Następnie git setpromailwystarczy zmienić adres e-mail tylko dla tego projektu.

Krok 3. Jeden przełącznik poleceń, proszę ?!

Czy nie byłoby miło przejść z domyślnego konta na określone za pomocą pojedynczego polecenia bez parametrów? Jest to zdecydowanie możliwe. To polecenie będzie miało dwa kroki:

  • zmień obecne piloty projektu na wybrane aliasy
  • zmień bieżącą konfigurację projektu user.email

Mamy już jedno rozwiązanie dla drugiego kroku, ale pierwsze jest o wiele trudniejsze. Zmiana zdalnego hosta za pomocą jednego polecenia

Oto rozwiązanie w postaci innego polecenia aliasu git, które można dodać do ~/.gitconfig:

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

Umożliwia to zmianę wszystkich pilotów z jednego hosta na inny (alias). Zobacz przykład:

$ > git remote -v
origin  [email protected]:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  [email protected]: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)

Połącz je wszystkie

Teraz musimy tylko połączyć dwa polecenia w jedno, jest to dość łatwe. Zobacz, jak integruję przełączanie hostów bitbucket.

[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 '[email protected]'"
  gopro = !sh -c \"git changeremotehost github.com github_pro && git changeremotehost bitbucket.com bitbucket_pro && git setpromail\"

Link do źródła - samouczek

Kaleem Ullah
źródło
To jest wspaniałe, dzięki. Pracuję z wieloma repozytoriami na e-mail, więc mój setpromailalias robi config --globalzamiast tego (i mam inne ustawione aliasy do ustawiania różnych adresów e-mail). To działa!
michel-slm
1
W przypadku tych 2 różnych kont, jak mogę podpisać przy użyciu różnych kluczy gpg? Mam 2x klucze gpg dla 2x kont github i chciałbym podpisać inaczej. „git config --global user.signingkey xxxx”
hakkican
Ta odpowiedź jest niesamowita. Prawie go nie przeczytałem, bo myślałem, że znalazłem odpowiedź na inną odpowiedź. Zdecydowanie zasługuje na więcej entuzjastów. PS. Jest jeszcze lepiej, gdy połączymy go useConfigOnly = truez drugą odpowiedzią.
steinybot
To nie jest IdentifyFile, to IdenfityFile.
Christian
40

Po otrzymaniu inspiracji z postu na blogu Orr Selli napisałem haczyk przed zatwierdzeniem (rezyduje w ~/.git/templates/hooks), który ustawiałby konkretne nazwy użytkowników i adresy e-mail na podstawie informacji zawartych w lokalnym repozytorium ./.git/config:

Musisz umieścić ścieżkę do katalogu szablonów w swoim ~/.gitconfig:

[init]
    templatedir = ~/.git/templates

Następnie każdy git initlub git cloneodbierze ten zaczep i zastosuje dane użytkownika podczas następnego git commit. Jeśli chcesz zastosować hak do już istniejących git initrepozytoriów, po prostu uruchom repozytorium w celu ponownego zainicjowania.

Oto hak, który wymyśliłem (nadal wymaga dopracowania - sugestie są mile widziane). Zapisz to jako

~/.git/templates/hooks/pre_commit

lub

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

i upewnij się, że jest wykonywalny: 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

EDYTOWAĆ:

Więc przepisałem hak jako hak i polecenie w Pythonie. Dodatkowo możliwe jest również wywołanie skryptu jako polecenia Git ( git passport). Możliwe jest również zdefiniowanie dowolnej liczby identyfikatorów w pliku configfile ( ~/.gitpassport), które można wybrać w monicie. Możesz znaleźć projekt na github.com: git-passport - Komenda Git i hak napisane w Pythonie do zarządzania wieloma kontami Git / tożsamościami użytkowników .

Saucier
źródło
1
To działa dobrze. Jednak działało to dla mnie lepiej, czyniąc z tego haczyk po kasie (zamiast po zatwierdzeniu). Moje sugestie, aby poprawić tę odpowiedź są wzmianki, że: 1. fragment musi być zapisane jako ~ / .git / templates / haki / post-Checkout i być podane zezwolenie chmod +x post-checkout, 2. git_remotesWartości zaczynają część całego hosta, na przykład [email protected], 3. local_idwartości powinny być edytowane przez użytkownika do odpowiednich nazw i adresów e-mail.
Shantanu Kumar
@ShantanuKumar Dzięki za komentarz. Poprawiłem odpowiedź, tak jak zaproponowałeś. Może wkrótce przepiszę skrypt w Pythonie.
Saucier
Dodano obsługę wyrażeń regularnych i repozytoriów bez pilotów. Dla łatwego pobierania wszystkie scalone tutaj . Ponownie rozpakuj, aby rozróżnić tożsamości dla różnych projektów w tej samej usłudze. A obsługa zdalnych repozytoriów z np. Domyślną tożsamością ma sens, jeśli git initnowe projekty z IDE, takie jak eclipse(które nie obsługują interaktywnych wyzwalaczy poprzedzających zatwierdzenie)
por.
25

Jeśli nie chcesz mieć domyślnego adresu e-mail (adres e- mail prowadzi do użytkownika github ), możesz skonfigurować, że chcesz być pytany. Jak to zrobić, zależy od używanej wersji git, patrz poniżej.

(Zamierzoną) wadą jest to, że musisz skonfigurować swój adres e-mail (i swoje imię) raz dla każdego repozytorium. Nie możesz więc tego zapomnieć.

Wersja <2.7.0

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

w globalnej konfiguracji, ~/.gitconfigjak stwierdzono w komentarzu Dana Aloni w poście na blogu Orr Selli . Podczas próby wykonania pierwszego zatwierdzenia w repozytorium git kończy się niepowodzeniem z ładnym komunikatem:

*** Please tell me who you are.

Run

  git config --global user.email "[email protected]"
  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)')

Nazwa jest pobierana z konfiguracji globalnej, gdy adres e-mail jest ustawiany lokalnie (wiadomość nie jest idealnie dokładna).

2.7.0 ≤ Wersja <2.8.0

Zachowanie w wersjach <2.7.0 nie było zamierzone i naprawione w wersji 2.7.0. Nadal możesz użyć haka przed zatwierdzeniem, jak opisano w blogu Orr Selli . To rozwiązanie działa również w przypadku innych wersji, ale inne rozwiązania nie dotyczą tej wersji.

Wersja ≥ 2.8.0

Dan Aloni dodał opcję osiągnięcia tego zachowania (patrz informacje o wersji ). Używaj go z:

[user]
    useConfigOnly = true

Aby działało, nie możesz podać nazwy ani adresu e-mail w konfiguracji globalnej. Następnie przy pierwszym zatwierdzeniu pojawia się komunikat o błędzie

fatal: user.useConfigOnly set but no name given

Wiadomość nie jest więc bardzo pouczająca, ale ponieważ wyraźnie ustawiłeś tę opcję, powinieneś wiedzieć, co robić. W przeciwieństwie do rozwiązania w wersji <2.7.0, zawsze musisz ręcznie ustawić zarówno nazwę, jak i adres e-mail.

Jan
źródło
Używam tej metody przez kilka miesięcy, działała świetnie. Mam wiele adresów e-mail (osobisty, służbowy) i nie chcę mieć „domyślnego” skonfigurowanego w globalnym gitconfig. Ze specjalną wartością „(brak)” git poprosi mnie o podanie prawidłowego adresu za każdym razem, gdy uruchamiam nowe repozytorium, zamiast zgadywania jednego na podstawie nazwy użytkownika i nazwy hosta (co jest denerwujące i muszę to - poprawić). Jednak ostatnio w ulepszonej wersji Git (2.7.0, może wcześniej) stwierdzam, że specjalna wartość „(brak)” nie powoduje już błędów krytycznych. Zamiast tego użyje po prostu „John Doe <(none)>” jak jest ...
Zhuoyun Wei
@wzyboy: Oh, masz rację. Kiedyś git bisectznajdowałem, że commit 19ce497c ... wprowadził to zachowanie. Jednak niezależnie od wersji (2.5 - 2.7) mogę używać email =(bez argumentów) w konfiguracji i pokazuje to samo zachowanie, co email = "(none)"w starszych wersjach. Czy możesz to potwierdzić? Jeśli tak, zmienię swoją odpowiedź. Jestem po prostu sceptyczny, ponieważ wydaje się to tak oczywiste i wcześniej go nie używałem.
Jan
Próbowałem email =w wersji 2.7.0, Git nadal zgaduje adres e-mail na podstawie nazwy użytkownika i nazwy hosta. Teraz używam pre-commitpodejścia na blogu Selli. Powiadomiłem również Dana Aloniego, który wpadł na ten "(none)"pomysł w poście
Selli,
3
od git-2.8: Zmiennej konfiguracji „user.useConfigOnly” można użyć, aby zmusić użytkownika do zawsze ustawiania user.email & user.name github.com/git/git/blob/master/Documentation/RelNotes/2.8.0. txt
rofrol
@rofrol Dziękujemy za informację. Zaktualizowałem odpowiednio swoją odpowiedź.
John
24

Z uwarunkowanymi obejmuje zawartym w Git 2.13 możliwe jest współistnienie wielu użytkowników / wiadomości e-mail na jednym komputerze przy niewielkiej pracy.

user.gitconfigma moje imię i nazwisko oraz adres e-mail. work-user.gitconfigma moje imię i nazwisko oraz adres e-mail. Oba pliki są w~ ścieżce.

Więc moje imię i nazwisko / adres e-mail mają zastosowanie domyślnie. W przypadku c:/work/reżimu stosowana jest nazwa mojej pracy / adres e-mail. W przypadku c:/work/github/reżimu stosowane jest moje imię i nazwisko / adres e-mail. Działa to po zastosowaniu ostatniego ustawienia.

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

gitdir rozróżnia małe i wielkie litery oraz gitdir/i wielkie litery.

"gitdir/i:github/"zastosuje warunkowe dołączanie do każdego katalogu ze githubswoją ścieżką.

POMOC
źródło
Chociaż Twoja odpowiedź jest doceniana i dobry Tomáš Janoušek dał te same 20 dni przed tobą. Proszę rozważyć usunięcie tej odpowiedzi.
Żywopłot
5
@ Żywopłot Tak, głosowałem za jego odpowiedzią, ale konfiguracja w systemie Windows zajęła mi trochę czasu i to gitdir/ipomogło mi (o czym jego odpowiedź nie wspomina).
hIpPy
Konkretny sposób, w jaki @hIpPy zaimplementował to bezpośrednio w moim przypadku użycia, sprawił, że śledzenie było znacznie łatwiejsze niż odpowiedzi Tomasza. Głosowałem za obiema.
Izaak Adams
18

Inną opcją gitpracy z wieloma nazwami / e-mailami jest aliasinggit i korzystanie z-c flagi do zastąpienia konfiguracji globalnej i specyficznej dla repozytorium.

Na przykład, definiując alias:

alias git='/usr/bin/git -c user.name="Your name" -c user.email="[email protected]"'

Aby zobaczyć, czy to działa, po prostu wpisz git config user.email:

$ git config user.email
name@example.com

Zamiast aliasu możesz również umieścić niestandardowy gitplik wykonywalny w swoim pliku $PATH.

#!/bin/sh
/usr/bin/git -c user.name="Your name" -c user.email="[email protected]" "$@"

Zaletą tej metody w stosunku do konkretnego repozytorium .git/configjest to, że ma ona zastosowanie do każdego gitrepozytorium, gdy gitaktywny jest program niestandardowy . W ten sposób możesz łatwo przełączać się między użytkownikami / nazwami bez modyfikowania dowolnej (współdzielonej) konfiguracji.

Rob W.
źródło
14

git aliasy (i sekcje w konfiguracjach git) na ratunek!

dodaj alias (z wiersza poleceń):

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

następnie ustaw na przykład

git config --global user.github.name "your github username"
git config --global user.github.email [email protected]

a w nowym lub sklonowanym repozytorium możesz uruchomić to polecenie:

git identity github

To rozwiązanie nie jest automatyczne, ale rozbraja użytkownika i pocztę e-mail w Twojej globalnej ~/.gitconfigkonfiguracji i user.useConfigOnlypowoduje, trueże git będzie przypominał o ustawieniu ich ręcznie w każdym nowym lub sklonowanym repozytorium.

git config --global --unset user.name
git config --global --unset user.email
git config --global user.useConfigOnly true
codnik
źródło
1
Podoba mi się twoje rozwiązanie; jednakże, kiedy rozbroiłem mój globalny, po prostu dokonuje zatwierdzenia z nazwą hosta mojego komputera, zamiast przypominać mi, żebym ustawił je w dowolnym repozytorium :(
ENG618,
12

Oto pełne kroki po przeczytaniu wielu odpowiedzi tutaj

Jak skonfigurować ustawienia wielu kluczy SSH dla różnych kont github

Możesz zacząć sprawdzać obecnie zapisane klucze

$ ssh-add -l

Jeśli zdecydujesz się wcześniej usunąć wszystkie klucze z pamięci podręcznej ( opcjonalnie, uważaj na to )

$ ssh-add -D

Następnie możesz utworzyć klucz ssh pub / priv powiązany z każdym adresem e-mail / kontem, którego chcesz / potrzebujesz użyć

$ cd ~/.ssh
$ ssh-keygen -t rsa -C "[email protected]" <-- save it as "id_rsa_work"
$ ssh-keygen -t rsa -C "[email protected]" <-- save it as "id_rsa_pers"

Po wykonaniu tych poleceń zostaną utworzone następujące pliki

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

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

Upewnij się, że agent uwierzytelniania jest uruchomiony

$ eval `ssh-agent -s`

Dodaj wygenerowane klucze w następujący sposób (z folderu ~ / .ssh)

$ ssh-add id_rsa_work
$ ssh-add id_rsa_pers

Teraz możesz ponownie sprawdzić zapisane klucze

$ ssh-add -l

Teraz potrzebujesz dodać wygenerowane klucze publiczne do swoich kluczy dostępu do serwera github / bickbuket

Sklonuj każde repozytorium do różnych folderów

Przejdź do folderu, w którym będzie działać praca użytkownika , i wykonaj to

$ git config user.name "Working Hard"
$ git config user.email "[email protected]" 

Aby zobaczyć, co to robi, sprawdź zawartość „.git / config”

Przejdź do folderu, w którym będzie pracować użytkownik pers , i wykonaj to

$ git config user.name "Personal Account"
$ git config user.email "[email protected]" 

Aby zobaczyć, co to robi, sprawdź zawartość „.git / config”

Po tym wszystkim będziesz mógł zatwierdzić swój osobisty i służbowy kod, po prostu przełączając się między tymi dwoma folderami

Jeśli używasz Git Bash i chcesz wygenerować klucze ssh w systemie Windows, wykonaj następujące kroki:

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

Mauricio Gracia Gutierrez
źródło
9

Istnieje proste rozwiązanie, które wydaje się działać dobrze w celu uniknięcia błędów.

Po prostu usuń [user]sekcję z twojego ~/.gitconfig, co uniemożliwi ci dokonywanie jakichkolwiek zatwierdzeń bez ustawianiauser.name dla każdego repozytorium.

W swoim ~/.bashrcdodaj kilka prostych aliasów dla użytkownika i e-maila:

alias ggmail='git config user.name "My Name";git config user.email [email protected]'
alias gwork='git config user.name "My Name";git config user.email [email protected]'
Zantier
źródło
Nie jest to świetne, ponieważ będziesz kopiować konfigurację w każdym repozytorium git
funkcjonalnym
9

Ta odpowiedź jest częściowo zainspirowana postem @Saucier, ale szukałem zautomatyzowanego sposobu ustawienia user.nameiuser.email na zasadzie repo, opartego na pilocie, który niż pakiet paszportowy git, który opracował . Również h / t do @John dla ustawienia useConfigOnly. Oto moje rozwiązanie:

.gitconfig zmiany:

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

hak po kasie, który należy zapisać na następującej ścieżce ~/.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

Używam różnych danych uwierzytelniających dla github i gitlab, ale te odniesienia w powyższym kodzie można zastąpić lub rozszerzyć dowolną usługą, z której korzystasz. Aby hak po wykonaniu transakcji automatycznie ustawiał nazwę użytkownika i adres e-mail lokalnie dla repozytorium po kasie, upewnij się, że nazwa usługi pojawia się w zdalnym adresie URL, dodaj ją do tablicy usług w post-checkoutskrypcie i utwórz dla niej sekcję Twój.gitconfig zawierający twoją nazwę użytkownika i adres e-mail dla tej usługi.

Jeśli żadna z nazw usług nie pojawi się w zdalnym adresie URL lub w repozytorium nie ma pilota, nazwa użytkownika i adres e-mail nie zostaną ustawione lokalnie. W takich przypadkach user.useConfigOnlyustawienie będzie działać, co nie pozwoli na dokonywanie zatwierdzeń, dopóki nazwa użytkownika i adres e-mail nie zostaną ustawione na poziomie repo, i poprosi użytkownika o skonfigurowanie tych informacji.

Grant Humphries
źródło
1
Świetne rozwiązanie. Nie zapomnij o chmod 755skrypcie przechwytującym. W przeciwnym razie zostanie skopiowany, ale nigdy nie zostanie wykonany.
onekiloparsec
5

GIT_AUTHOR_EMAIL + lokalny .bashrc

.bashrc_local: nie śledź tego pliku, umieść go tylko na komputerze służbowym:

export GIT_AUTHOR_EMAIL='[email protected]'
export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"

.bashrc: śledź ten plik, zrób to samo na komputerach roboczych i domowych:

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

Korzystam z https://github.com/technicalpickles/homesick do synchronizacji moich plików dot.

Gdyby tylko gitconfig zaakceptował zmienne środowiskowe: Rozszerzenie zmiennych powłoki w git config

Ciro Santilli
źródło
5

Środowisko Windows

Dodatkowo można to zmienić Git Extensions --> Settings --> Global Settings, jeśli masz zainstalowany w swoich systemach.

gitextension-najnowsze-wydanie

Kliknij prawym przyciskiem myszy folder / katalog w środowisku Windows, aby uzyskać dostęp do tych ustawień. wprowadź opis zdjęcia tutaj

Aktualizacja : Jak przełączać / utrzymywać wiele ustawień w wersji 2.49 Jak przełączać / utrzymywać wiele ustawień w wersji 2.49

Abhijeet
źródło
W jaki sposób odnosi się to do wielu użytkowników, a nie tylko ich edycji?
@D_N Zaktualizowano o nowy zrzut ekranu z opcjami zmiany ustawień.
Abhijeet,
Otwórz lokalny folder repo i wybierz git-config z menu nawigacyjnego, a następnie kliknij kartę repozytorium lokalnego, zawartość zostanie zastosowana do $ ścieżka_repo_lokalna / .git / config zgodnie z powyższą odpowiedzią.
maxwu
3

Może to prosty hack, ale jest użyteczny. Po prostu wygeneruj 2 klucze ssh jak poniżej.

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 [email protected]
The key's randomart image is:
+---[RSA 4096]----+
|. .oEo+=o+.      |
|.o o+o.o=        |
|o o o.o. +       |
| =.+ .  =        |
|= *+.   S.       |
|o*.++o .         |
|=.oo.+.          |
| +. +.           |
|.o=+.            |
+----[SHA256]-----+

W ten sam sposób stwórz jeszcze jeden dla osobistego. Masz więc 2 klucze ssh, pracę i firmę. Skopiuj work.pub, work, personal.pub, personal do ~ / .ssh / Directory.

Następnie utwórz skrypt powłoki z następującymi wierszami i nadaj mu nazwę crev.sh (Company Reverse) o następującej treści.

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

W ten sam sposób utwórz jeszcze jeden o nazwie prev.sh (Personal Reverse) o następującej treści.

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

w ~ / .bashrc dodaj aliasy dla tych skryptów jak poniżej

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

Ilekroć chcesz skorzystać z towarzystwa, po prostu zrób crev, a jeśli chcesz skorzystać z osobistego, zrób prev :-p.

Dodaj te klucze ssh do swoich kont GitHub. Upewnij się, że nie wygenerowano wcześniej id_rsa, ponieważ te skrypty zastąpią id_rsa. Jeśli już wygenerowałeś id_rsa, użyj tego dla jednego z kont. Skopiuj je jako osobiste i pomiń generowanie kluczy osobistych.

7H3 IN5ID3R
źródło
1

Zrobiłem funkcję bash, która to obsługuje. Oto repozytorium Github .

Do wiadomości:

# 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'
Arount
źródło
1

Po prostu dodaj to do ~ / .bash_profile, aby przełączać się między domyślnymi kluczami dla 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"
Jason DeBolt
źródło
1

Możesz także użyć git commit --author "Your Name <[email protected]>"w momencie wykonywania zatwierdzenia w repozytorium, w którym chcesz zatwierdzić jako inny użytkownik.

szx
źródło
0

Coś jak odpowiedź Roba W , ale dopuszczenie innego klucza ssh i działa ze starszymi wersjami git (które nie mają np. Konfiguracji core.sshCommand).

Plik utworzyłem ~/bin/git_poweruserz uprawnieniami do wykonywania w ścieżce:

#!/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="[email protected]" $@

Ilekroć chcę zatwierdzić lub przekazać coś jako „Użytkownik git_poweruserzaawansowany ”, używam zamiast git. Powinien działać na każdym katalogu i nie wymaga zmian .gitconfiglub .ssh/configprzynajmniej nie w moim.

Jellby
źródło
0

Chociaż większość pytań w pewnym stopniu odpowiadała PO, po prostu musiałem przez to przejść i nawet bez googlingu byłem w stanie znaleźć najszybsze i najprostsze rozwiązanie. Oto proste kroki:

  • skopiuj istniejący .gitconfgz drugiego repozytorium
  • wklej do nowo dodanego repozytorium
  • zmień wartości w .gitconfigpliku, takie jak nazwa, adres e-mail i nazwa użytkownika [user] name = John email = [email protected] username = john133
  • dodaj nazwę pliku do .gitignorelisty, aby upewnić się, że nie zatwierdzasz .gitconfigpliku do repozytorium pracy
Tatarin
źródło