Использование разных SSH ключей для разных Bitbucket аккаунтов

Эта краткая заметка расскажет о том, как можно добавить поддержку сразу нескольких SSH ключей для разных аккаунтов Bitbucket. К примеру, такая необходимость может возникнуть если у вас на работе используется bitbucket для хранения исходного кода и вам нужно регать новый аккаунт для этого сервиса, но в тот же момент у вас есть и личный акк на Bitbucket'e, которым тоже нужно пользоваться.
В таком случае попытка привязать один SSH ключ выдаст ошибку, т.к. у bitbucket 1 ssh ключ = 1 аккаунт. Но есть простое решение, которое заключается в том, чтобы создать config файл для ssh ключей доступа в котором будет явно указано к какому пользователю относится конкретный ssh ключ.
1. Создаем SSH ключ для каждого Bitbucket аккаунта
Чтобы сгенерировать новую пару ключ-значение, пишем в терминале команду, которая создаст и сохранит в папку ~/.ssh/:
ssh-keygen -t rsa -C "your_email@example.com" -f "user1"
где t это тип создаваемого ключа, C создание комментария, f (filename) имя создаваемого файла. Полный список аргументов для ssh-keygen тут.
2. Добавляем SSH ключ в Bitbucket аккаунт
Тут все просто. Открываем каждый профиль и добавляем туда SSH ключ, что был создан для этого профиля.
3. Конфигурируем SSH
И самый ответственный момент - это создание правильной конфигурации для SSH. Создаем новый файл (если у вас еще нет этого файла):
touch ~/.ssh/config
или делаем backup существующего, если файл с какими-то конфигами уже имеется. И наполняем файл примерно таким содержимым:
#user1 account
Host bitbucket.org-user1
HostName bitbucket.org
User git
IdentityFile ~/.ssh/user1
IdentitiesOnly yes
#user2 account
Host bitbucket.org-user2
HostName bitbucket.org
User git
IdentityFile ~/.ssh/user2
IdentitiesOnly yes
заменяя при этом в строках IdentityFile user1 и user2 на созданные ssh файлы, а в Host строке нужно заменить user1 и user2 на ваши логины в bitbucket.
Вот и все. Чтоб клонировать проект test/test с Bitbucket'a под правами конкретного юзера, нужно дописать после имени хоста -user1.
git clone git@bitbucket.org-user1:test/test.git
а если проект уже развернут локально, но нужно дальше поддерживать его под конкретным юзером, то открываем на редактирование локальный конфиг git репозитория вашего проекта
nano .git/config
и дописываем аналогично -user1 для значения url:
[remote "origin"]
url = git@bitbucket.org-user1:test/test.git
fetch = +refs/heads/*:refs/remotes/origin/*
Вот и все. Аналогичным способом можно указывать разные SSH ключи для разных GIT хранилищ. К примеру, если часть проектов на github, другая часть на bitbucket, а еще что-то на собственных серверах компании, то можно также писать:
#Main work accounts
Host bitbucket.org-user1
HostName bitbucket.org
User git
IdentityFile ~/.ssh/corporate_key
IdentitiesOnly yes
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/corporate_key
IdentitiesOnly yes
#Personal Bitbucket account
Host bitbucket.org-user2
HostName bitbucket.org
User git
IdentityFile ~/.ssh/personal_key
IdentitiesOnly yes
P.S. ну и не забывайте указывать в каждом локальном git конфиге проекта соответствующее имя и e-mail юзера, если вы делаете коммиты в различные проекты под различными пользователями, у каждого из которых свой корпоративный e-mail должен быть
Доп. источники на английском: