Як керувати кількома обліковими записами GitHub на одній машині за допомогою ключів SSH

Потреба в управлінні кількома обліковими записами GitHub на одній машині виникає у певний момент часу для більшості розробників. Кожного разу, коли мені трапляється змінювати свій Mac або мені потрібно Git push з новим робочим обліковим записом, я в кінцевому підсумку переглядаю, як робити щось, що я робив понад півдюжини разів.

Моя лінь, не задокументувавши процес, і невміння запам’ятати кроки змушує мене витратити пристойну кількість часу, отримуючи шматочки з усього Інтернету, а потім якось змушуючи це працювати.

Я впевнений, що серед вас є багато тих, хто був там, робив це, і багато інших, хто просто чекає наступного разу, коли відбудеться те саме (і я в тому числі!). Ця спроба покликана допомогти нам усім.

1. Генерація ключів SSH

Перш ніж генерувати ключ SSH, ми можемо перевірити, чи є у нас якісь існуючі ключі SSH: ls -al ~/.sshТут буде перераховано всі існуючі пари відкритих та приватних ключів, якщо такі є.

Якщо ~/.ssh/id_rsaдоступний, ми можемо використати його повторно, або ж спочатку ми можемо створити ключ до типового ~/.ssh/id_rsa, запустивши:

ssh-keygen -t rsa

Коли з’явиться запит про місце збереження клавіш, прийміть місце за замовчуванням, натиснувши клавішу Enter. Приватний та відкритий ключі ~/.ssh/id_rsa.pubбудуть створені в типовому розташуванні ssh ~/.ssh/.

Давайте використаємо цю пару ключів за замовчуванням для нашого особистого кабінету.

Для робочих облікових записів ми створимо різні ключі SSH. Наведений нижче код генерує ключі SSH та зберігає відкритий ключ із тегом [email protected]_mail.com” у~/.ssh/id_rsa_work_user1.pub

$ ssh-keygen -t rsa -C "[email protected]_mail.com" -f "id_rsa_work_user1" 

У нас створено два різні ключі:

~/.ssh/id_rsa ~/.ssh/id_rsa_work_user1

2. Додавання нового ключа SSH до відповідного облікового запису GitHub

Ми вже готові відкриті ключі SSH, і ми попросимо наші облікові записи GitHub довіряти створеним нами ключам. Це для позбавлення від необхідності вводити ім’я користувача та пароль кожного разу, коли ви натискаєте Git.

Скопіюйте pbcopy < ~/.ssh/id_rsa.паб із відкритим ключем, а потім увійдіть у свій особистий обліковий запис GitHub:

  1. Йти до Settings
  2. Виберіть SSH and GPG keysз меню ліворуч.
  3. Клацніть на New SSH key, надайте відповідний заголовок та вставте ключ у поле нижче
  4. Клацніть Add key- і готово!
Для робочих облікових записів використовуйте відповідні відкриті ключі ( pbcopy < ~/.ssh/id_rsa_work_user1.pub) і повторіть наведені вище дії у своїх робочих облікових записах GitHub.

3. Реєстрація нових ключів SSH у ssh-агенті

Щоб використовувати ключі, ми повинні зареєструвати їх у ssh-агенті на нашій машині. Переконайтесь, що ssh-agent працює за допомогою команди eval "$(ssh-agent -s)".

Додайте ключі до агента ssh приблизно так:

ssh-add ~/.ssh/id_rsa ssh-add ~/.ssh/id_rsa_work_user1

Зробіть, щоб ssh-агент використовував відповідні ключі SSH для різних хостів SSH.

Це найважливіша частина, і ми маємо два різні підходи:

Використовуючи файл конфігурації SSH (крок 4) та маючи лише один активний ключ SSH в ssh-агенті одночасно (крок 5).

4. Створення файлу конфігурації SSH

Тут ми фактично додаємо правила конфігурації SSH для різних хостів, вказуючи, який файл ідентифікатора використовувати для якого домену.

Конфігураційний файл SSH буде доступний за адресою ~ / .ssh / config .Відредагуйте його, якщо він існує, інакше ми можемо просто створити його.

$ cd ~/.ssh/ $ touch config // Creates the file if not exists $ code config // Opens the file in VS code, use any editor

Зробіть записи конфігурації для відповідних облікових записів GitHub подібними до наведених нижче у вашому ~/.ssh/configфайлі:

# Personal account, - the default config Host github.com HostName github.com User git IdentityFile ~/.ssh/id_rsa # Work account-1 Host github.com-work_user1 HostName github.com User git IdentityFile ~/.ssh/id_rsa_work_user1

Work_user1 ” - це ідентифікатор користувача GitHub для робочого облікового запису.

G ithub.com- work_user1 ” - це позначення, що використовується для розмежування кількох облікових записів Git. Ви також можете використовувати позначення “ work_user1.g ithub.com” . Переконайтеся, що ви узгоджуєтесь із позначенням імен хостів, які ви використовуєте. Це актуально, коли ви клонуєте сховище або коли ви встановлюєте віддалене джерело для локального сховища

Вищевказана конфігурація просить ssh-agent:

  • Використовуйте id_rsa як ключдлябудь-яку URL-адресу Git, яка використовує @ github.com
  • Використовуйте ключ id_rsa_work_user1 для будь-якої URL-адреси Git, яка використовує @ github.com-work_user1

5. Один активний ключ SSH в агенті ssh за раз

Цей підхід не вимагає правил конфігурації SSH. Навпаки, ми вручну гарантуємо, що на час будь-якої операції Git агент ssh-агент має прикріпити лише відповідний ключ.

ssh-add -lперелічить усі ключі SSH, приєднані до ssh-агента. Видаліть усі та додайте ту саму клавішу, яку ви збираєтеся використовувати.

Якщо ви збираєтеся натиснути на особистий рахунок Git:

$ ssh-add -D //removes all ssh entries from the ssh-agent $ ssh-add ~/.ssh/id_rsa // Adds the relevant ssh key

Тепер у ssh-агента ключ зіставлений з особистим обліковим записом GitHub, і ми можемо здійснити натискання Git на особисте сховище.

Щоб перейти на свій робочий рахунок GitHub-1, змініть ключ SSH, зіставлений із агентом ssh, видаливши існуючий ключ і додавши ключ SSH, зіставлений із робочим обліковим записом GitHub.

$ ssh-add -D $ ssh-add ~/.ssh/id_rsa_work_user1

The ssh-agent at present has the key mapped with the work Github account, and you can do a Git push to the work repository. This requires a bit of manual effort, though.

Setting the git remote Url for the local repositories

Once we have local Git repositories cloned /created, ensure the Git config user name and email is exactly what you want. GitHub identifies the author of any commit from the email id attached with the commit description.

To list the config name and email in the local Git directory, do git config user.name and git config user.email. If it’s not found, update accordingly.

git config user.name "User 1" // Updates git config user name git config user.email "[email protected]"

6. While Cloning Repositories

Note: step 7 will help, if we have the repository already available on local.

Now that the configurations are in place, we can go ahead and clone the corresponding repositories. On cloning, make a note that we use the host names that we used in the SSH config.

Repositories can be cloned using the clone command Git provides:

git clone [email protected]:personal_account_name/repo_name.git

The work repository will require a change to be made with this command:

git clone [email protected]_user1:work_user1/repo_name.git

This change is made depending on the host name defined in the SSH config. The string between @ and : should match what we have given in the SSH config file.

7. For Locally Existing Repositories

If we have the repository already cloned:

List the Git remote of the repository, git remote -v

Check whether the URL matches our GitHub host to be used, or else update the remote origin URL.

git remote set-url origin [email protected]_user1:worker_user1/repo_name.git

Ensure the string between @ and : matches the Host we have given in the SSH config.

If you are creating a new repository on local:

Initialize Git in the project folder git init.

Create the new repository in the GitHub account and then add it as the Git remote to the local repository.

git remote add origin [email protected]_user1:work_user1/repo_name.git 

Ensure the string between @ and : matches the Host we have given in the SSH config.

Push the initial commit to the GitHub repository:

git add . git commit -m "Initial commit" git push -u origin master

We are done!

Adding or updating the Git remote of the local Git directory with the proper host will take care of selecting the correct SSH key to verify our identity with GitHub. With all the above in place, our git operations should work seamlessly.