Ключи от всех дверей

Вы пользуетесь git. У вас сгенерированы приватный и публичный ключи, связанные с вашим email-адресом. Один ключ и один адрес. Но что если нужно больше одного? Как привязать несколько аккаунтов со своими данными и автоматизировать вход?

Генерация ssh-ключей

При генерации ключа следует указать ему отличное от дефолтного имя. По-умолчанию используются имена id_rsa (приватный ключ) и id_rsa_pub (ключ публичный). Чтобы создать файлы с другими именами или просто не затереть уже существующие сгенерируем ключи с флагом -f. Например, сделаем автономными данные для github.

$ ssh-keygen -t ed25519 -C "your_name@yourmail.domain" -f ~/.ssh/github

В качестве пользователя используйте данные вашей почтовой учётной записи. В скрытом домашнем каталоге ~/.ssh теперь лежат два файла с нестандартными именами: github и github.pub. Содержимое последнего копируется на git-сервер.

Если ключи генерируются на сервере, перенести их на локальную машину можно так:

# на сервере, 7021 - нестандартный порт
$ ssh company_user@server.domain -p 7021
$ ssh-keygen -t ed25519 -C "user@server.domain" -f ~/.ssh/mycompany_key

# локально
$ scp -r -P 7021 company_user@server.domain:/home/company_user/.ssh/ /home/local_user/

Заходим на сервер по ssh под именем нужного пользователя, генерируем ключ. Затем на локальной машине через scp копируем рекурсивно каталог с ssh-ключами. Рекурсивно: -r, если используется нестандартный порт: -P.

Как автоматизировать вход

Допустим, у нас десятки ключей от git-серверов разных компаний. Как сказать git'у, под какой учётной записью работать в каждом конкретном случае? Для этого понадобится изменить конфигурацию. Создаём в ~/.ssh файл config с подходящими настройками:

Host github.com
  Hostname github.com
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/github

Host mycompany.com
  Hostname mycompany.com
  Port 7021
  IdentityFile ~/.ssh/mycompany_key

Теперь при работе в репозитории github или mycompany будут использованы ключи, соответствующие адресу домена. Что и требовалось.

Однако, коммиты закрепляются за одним только пользователем. Как вариант решения: указать одного пользователя глобально, а других для каждого репозитория (без флага global):

$ git config --local user.email myuser@mymail.doman
$ git config --local user.name myusername

Либо изменять автора на лету, при создании коммита:

$ git commit --author=myuser "commit"

Игнорируй всё

В работе каждый подбирает для себя наиболее удобный инструмент. Кто-то пользуется простым текстовым редактором, кто-то предпочитает навороченные среды разработки. Часто инструменты оставляют после себя «мусор», который не хотелось бы тащить в .gitignore публичного проекта.

Для того нам дан ещё один файл с настройками гита — .gitconfig. Открываем, вносим информацию.

# базовые настройки
[core]
  autocrlf = input
  quotepath = false
  whitespace = cr-at-eol,indent-with-non-tab,blank-at-eol,space-before-tab
  excludesfile = /home/local_user/.gitignore_global
# псевдонимы для команд
[alias]
  ch = checkout
  cm = commit -m

Всё внимание на строку excludesfile = /home/user/.gitignore_global. Именно эта волшебная настройка позволяет внести в .gitignore_global (или любой другой файл) то, что будет игнорироваться (не будет отправлено на сервер) всегда.