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
Вот так будет выглядеть верная схема с sshCommand