Skip to content

Multiple git аккаунты

Если вам нужно работать под несколькими учетками в Git, используйте параметр конфигурации sshCommand Git, чтобы управлять как вашими учетными данными SSH, так и вашим идентификатором Git с помощью одной конфигурации, основанной на вашем пути к каталогу.

Multiple акканутами сложно управлять по двум причинам: - Идентичность: информация о вас прикрепленная к коммиту внутри репозитория(управляется Git приложением) - Аутентификация: проверка того, что вы на самом деле являетесь собой, прежде чем вам будет разрешено взаимодействовать с репозиторием. Этим управляет ваш локальный компьютер и служба, на которой размещены ваши удаленные репозитории.

Эти два механизма управляются отдельно, но оба они поддерживают некоторые условия в своих файлах конфигурации, но не учитывают одни и те же факторы, что приводит к поддержанию двух параллельных наборов конфигурации, если они не настроены логично.

1. Ваша Identity в Git

Когда вы используете Git локально на своем компьютере, у вас есть поля, которые вы настраиваете локально и которые используются для маркировки ваших коммитов, типичными примерами которых являются: - User name - Email address - GPG signing key Если вы еще не испольуете signed commits - почитайте статью про commit spoofing

Identity управляется в конфиге ~/.gitconfig.

Имя пользователя и адрес электронной почты берутся из этого файла и помещаются в коммиты, которые вы делаете в локальном репозитории.

.gitconfig - не обязательно единственный файл для управления Git. Мы можем использовать includeIf , чтобы задать условия по подключения конфиг файла в зависимости от того в какой директории расположен git репозиторий(много опций но для нас интересна gitdir):

[include]  # optional (if you sometimes work outside of your regular directories)
    path = ~/.gitconfig-4volodin
[includeIf "gitdir:~/code/4volodin/"]
    path = .gitconfig-4volodin
[includeIf "gitdir:~/code/4truedev/"]
    path = .gitconfig-4truedev

~/.gitconfig-4volodin

[user]
    name = Aleks Volodin
    email = 4volodin@gmail.com
    signingkey = 123.......02
[core]
    sshCommand = "ssh -i ~/.ssh/id_rsa-4volodin-yubi.pub"

~/.gitconfig-4truedev

[user]
    name = Aleks Truedev
    email = 4truedev@gmail.com
    signingkey = ~/.ssh/id_ed25519-4truedev.pub
#use SSH for signing
[gpg]
    format = ssh
[core]
    sshCommand = "ssh -i ~/.ssh/id_ed25519-4truedev"
Это решает проблему включения имени, адреса электронной почты и ключа подписи для коммитов в мои рабочие репозитории.

Однако он не учитывает аутентификацию на нескольких хостах Git.

2. Аутентификация

Вы могли бы настроить локальный клиент Git для использования HTTPS для взаимодействия с репозиториями, размещенными в GitHub, но у Git нет возможности хранить учетные данные и нет демона для их кэширования, поэтому вам придется входить в систему вводить пароль для каждого clone, push, pull.

Чтобы обойти эту проблему, Git может использовать SSH для аутентификации вас и шифрования ваших сообщений с удаленным компьютером.

Generate SSH key: ssh-keygen -t ed25519 -C "your_personal_email@example.com" -f ~/.ssh/<personal_key>

Чтобы git сказать какую ssh команду использовать в конфиг файле поэтому мы задали sshCommand

Если не использовать sshCommand, то пришлось бы создавать в ~/.ssh/config для каждого хоста и для каждого акканута свой хост с настройками. Через sshCommand мы указываем Git, какой ключ использовать, явно задавая команду SSH (опция -i используется для указания файла идентификации или ключа). Это дает нам больше контроля. Например, представьте, что у вас есть несколько учетных записей на одном хосте (например, github.com). Если бы вы использовали конфигурационный файл SSH для использования разных SSH-ключей, вам бы пришлось создать и запомнить произвольный префикс, например, first.github.com, а затем помнить использовать этот домен каждый раз, когда вы хотите клонировать репозиторий с этой учетной записью. Это менее гибко и немного неудобно.
# Host github.com
#     Hostname github.com
#     User 4volodin
#     IdentitiesOnly yes
#     IdentityFile ~/.ssh/id_rsa-4volodin-yubi.pub
# Host github.com-truedev
#     Hostname github.com
#     User 4truedev
#     IdentitiesOnly yes
#     IdentityFile ~/.ssh/id_ed25519-4truedev.pub

# Host gitlab.com
#     Hostname gitlab.com
#     User 4volodin
#     IdentitiesOnly yes
#     IdentityFile ~/.ssh/id_rsa-4volodin-yubi.pub
# Host gitlab.com-truedev
#     Hostname gitlab.com
#     User 4truedev
#     IdentitiesOnly yes
#     IdentityFile ~/.ssh/id_ed25519-4truedev.pub
Схема с избыточным использованием Host в ~/.ssh/config ![alt text](images/multiple-git-accounts/image-1.png)

Вот так будет выглядеть верная схема с sshCommand alt text