Допустим, alice
пользователь github.com с 2 или более закрытыми репозиториями repoN
. Для этого примера мы будем работать только с двумя именами репозиториев repo1
иrepo2
https://github.com/alice/repo1
https://github.com/alice/repo2
Вы должны извлекать данные из этих репозиториев, не вводя пароли, вероятно, на сервере или на нескольких серверах. Вы хотите выполнить, git pull origin master
например, и вы хотите, чтобы это происходило без запроса пароля.
Вам не нравится иметь дело с ssh-agent, вы обнаружили (или открываете сейчас) ~/.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
ключи Deploy, но 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
конфигурацию ключей Deploy на 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 ключ на машину и выполнить репо. У вас будет намного больше ключей для обработки, но вы будете менее уязвимы, если кто-то будет взломан.