Скажімо, alice
це користувач github.com, який має 2 або більше приватних сховищ repoN
. У цьому прикладі ми будемо працювати лише з двома сховищами з назвою repo1
таrepo2
https://github.com/alice/repo1
https://github.com/alice/repo2
Вам потрібно витягнути з цих сховищ, не вводячи паролі, ймовірно, на сервері або на декількох серверах. Ви хочете виконати, git pull origin master
наприклад, і хочете, щоб це сталося, не запитуючи пароль.
Вам не подобається мати справу з ssh-агентом, ви дізналися (або ви зараз дізнаєтесь) про ~/.ssh/config
файл, який дозволить вашому ssh-клієнту знати, який приватний ключ використовувати, залежно від імені хоста та імені користувача, з простою конфігураційною записом, що виглядає як це:
Host github.com
HostName github.com
User git
IdentityFile /home/alice/.ssh/alice_github.id_rsa
IdentitiesOnly yes
Таким чином, ви пішли вперед і створили (alice_github.id_rsa, alice_github.id_rsa.pub)
ключ, а потім перейшли до .git/config
файлу вашого сховища, і ви змінили URL-адресу дистанційного керування origin
таким чином:
[remote "origin"]
url = "ssh://git@github.com/alice/repo1.git"
І нарешті ви перейшли до Settings > Deploy keys
розділу сховища та додали вмістalice_github.id_rsa.pub
У цей момент ви можете зробити своє, git pull origin master
не вводячи пароль без проблем.
а як щодо другого сховища?
Тож ваш інстинкт полягає в тому, щоб схопити цей ключ і додати його до repo2
ключів розгортання, але github.com помилиться і скаже вам, що ключ вже використовується.
Тепер ви запускаєте і генеруєте інший ключ ( ssh-keygen -t rsa -C "alice@alice.com"
звичайно, використовуючи без паролів), і щоб це не стало безладом, тепер ви назвете свої ключі так:
repo1
ключове слово: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
repo2
ключове слово: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)
Тепер ви поставите новий відкритий ключ у repo2
конфігурацію ключів розгортання на github.com, але тепер у вас є проблема ssh.
Як ssh може вказати, який ключ використовувати, якщо сховища розміщуються в одному github.com
домені?
Ваш .ssh/config
файл вказує на, github.com
і він не знає, який ключ використовувати, коли настав час робити тягнення.
Тож я знайшов хитрість з github.com. Ви можете сказати своєму ssh-клієнту, що кожне сховище живе в іншому піддомені github.com. У цих випадках вони будуть repo1.github.com
іrepo2.github.com
Тому спочатку потрібно редагувати .git/config
файли на ваших клонах репо, щоб вони виглядали приблизно так:
Для репо1
[remote "origin"]
url = "ssh://git@repo1.github.com/alice/repo1.git"
Для репо2
[remote "origin"]
url = "ssh://git@repo2.github.com/alice/repo2.git"
А потім у вашому .ssh/config
файлі тепер ви зможете ввести конфігурацію для кожного піддомену :)
Host repo1.github.com
HostName github.com
User git
IdentityFile /home/alice/.ssh/repo1.alice_github.id_rsa
IdentitiesOnly yes
Host repo2.github.com
HostName github.com
User git
IdentityFile /home/alice/.ssh/repo2.alice_github.id_rsa
IdentitiesOnly yes
Тепер ви можете git pull origin master
без введення паролів з обох сховищ.
Якщо у вас є кілька машин, ви можете скопіювати ключі на кожну з машин і повторно використовувати їх, але я б радив виконати роботу на ногах, щоб створити 1 ключ на машині і репо. У вас буде набагато більше ключів для обробки, але ви будете менш вразливі, якщо з одним буде підданий компроміс.