December 2, 2025

🎯 Как работать с несколькими SSH-ключами в Git и GitHub (личный + рабочий аккаунт)

Если вы используете GitHub и у вас есть личный и рабочий аккаунты, то быстро появляется боль:
Git не понимает, какой SSH-ключ подставить, и начинает всё ломаться — от доступа к репо до установки зависимостей.

Разбираем, как это решить красиво и автоматизировано.


🔐 Проблема

Git работает по SSH через ключи.
Обычно всё просто:

  1. генерируете приватный + публичный ключ,
  2. добавляете публичный в GitHub,
  3. клонируете по git@github.com:user/repo.git.

Но вот если аккаунтов несколько, то возникает затык:
Git не знает, какой ключ выбрать для конкретного репозитория.

SSH ключи есть, но Git напрямую ими не управляет.


✅ Шаг 1. Создаём alias для SSH

В файле ~/.ssh/config настраиваем «виртуальный сервер» — алиас, который будет использовать нужный ключ:

Host github-company
  HostName github.com
  User git
  IdentityFile ~/.ssh/your-company-private-key
  IdentitiesOnly yes

Проверяем:

ssh -T git@github-company
# Hi <username>! You've successfully authenticated, but GitHub does not provide shell access.

Теперь можно клонировать репозитории через:

git clone git@github-company:company/repo.git

Но… так делать неудобно.

❗ Почему

Потому что внутри проекта могут быть другие SSH-ссылки, например в Python-зависимостях, которые тоже ведут на git@github.com:company/....
И их приходится вручную менять на alias — иначе не скачивается.

Это ломает lock-файлы, требует ручных правок и очень легко случайно закоммитить.

✅ Шаг 2. Пусть Git сам подменяет адреса

Git умеет включать дополнительные конфиги в зависимости от пути к репозиторию.

Открываем (или создаём) ~/.gitconfig:

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

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

Теперь создаём файл .gitconfig-work в домашней директории:

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

[url "ssh://git@github.com-company/company/"]
  insteadOf = ssh://git@github.com/company/

[url "git@github.com-company:company/"]
  insteadOf = git@github.com:company/

🧠 Что теперь происходит

Если вы работаете внутри ~/workspace/work/, Git:

  • видит SSH-ссылку вида git@github.com:company/...
  • автоматически заменяет её на git@github-company:company/...
  • SSH автоматически использует правильный ключ
  • вам вообще ничего менять не нужно

🎉 Итог

Вы можете одновременно работать:

  • под личным аккаунтом,
  • под рабочим аккаунтом,
  • без ручной правки ссылок,
  • без поломанных зависимостей,
  • без риска случайно закоммитить alias-ссылки.

Вся магия — это связка:

  • ~/.ssh/config
  • ~/.gitconfig
  • includeIf + insteadOf