Наверное, простой вопрос, но я здесь не понимаю...
В github можно добавить ключ развертывания для каждого репозитория, который предоставляет доступ только к одному репозиторию.
Но для одного клиента у меня есть два проекта, управляемых с помощью git на одном сервере (проект A и проект B). Если я использую открытый ключ для проекта A, github говорит мне, что я не могу использовать его в качестве ключа развертывания для проекта B и наоборот.
Как создать другой открытый ключ и настроить git для использования одного ключа для проекта A, а другой для проекта B?
Ответ 2
Скажем, 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://[email protected]/alice/repo1.git"
И, наконец, вы перешли в раздел репозитория Settings > Deploy keys
и добавили содержимое alice_github.id_rsa.pub
На этом этапе вы можете сделать свой git pull origin master
без ввода пароля без проблем.
, но как насчет второго репозитория?
Итак, ваш инстинкт должен захватить этот ключ и добавить его в repo2
Развернуть ключи, но github.com выйдет из системы и скажет вам, что ключ уже используется.
Теперь вы идете и создаете другой ключ (используя ssh-keygen -t rsa -C "[email protected]"
без паролей, конечно), и чтобы это не стало беспорядком, вы теперь назовете свои ключи следующим образом:
-
repo1
keypair: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
-
repo2
keypair: (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
на ваших клонах репо, поэтому они выглядят следующим образом:
Для repo1
[remote "origin"]
url = "ssh://[email protected]/alice/repo1.git"
Для repo2
[удаленное "происхождение" ] 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 ключ на машину и репо. У вас будет гораздо больше ключей для обработки, но вы будете менее уязвимы, если вы получите компрометацию.