Допустим, 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)
keypair, вы также пошли в файл хранилища .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 keys на 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 ключ на машину и выполнить репо.У вас будет намного больше ключей для обработки, но вы будете менее уязвимы, если кто-то будет взломан.