настройка Git для нескольких репозиториев на одном сервере

возможно, простой вопрос, но я здесь в недоумении...

в github можно добавить ключ развертывания для каждого репозитория, который дает доступ только к этому одному репозиторию.

но для одного клиента у меня есть два проекта, управляемые с git на одном сервере (проект A и проект B). Если я использую открытый ключ для проекта A, github говорит мне, что я не могу использовать его в качестве ключа развертывания для проекта B и наоборот.

Как создать другой открытый ключ и настроить git использовать один ключ для проекта A, а другой для проекта B?

2 ответов


на ssh способ сделать это будет с помощью ~/.ssh/config, создание псевдонима имени хоста и доступ к github с разными именами хостов для обоих проектов. Я понятия не имею, есть ли git config (или git remote) кстати тоже.

Host a.github.com
HostName github.com
User git
IdentityFile ~/.ssh/project-a-id_rsa

Host b.github.com
HostName github.com
User git
IdentityFile ~/.ssh/project-b-id_rsa

затем использовать a.github.com:user/project-a.git или b.github.com:user/project-b.git (или аналогичный) в качестве URL-адресов репозитория.


давайте 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) 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ключи развертывания, но github.com будет ошибка и сказать вам, что ключ уже используется.

теперь вы идете и создайте еще один ключ (используя ssh-keygen -t rsa -C "alice@alice.com" без паролей, конечно), и чтобы это не стало беспорядком, вы теперь назовете свои ключи так:

  • 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конфигурация ключей развертывания на github.com, но теперь у вас есть проблема ssh для решения.

как ssh может определить, какой ключ использовать, если репозитории размещаются на том же github.com домен?

код .ssh/config file указывает на github.com и он не знает, какой ключ использовать, когда пришло время, чтобы сделать тягу.

поэтому я нашел трюк с github.com - ... Вы можете сообщить своему ssh-клиенту, что каждый репозиторий живет в другом github.com поддомен, в этих случаях они будут repo1.github.com и repo2.github.com

Итак, первое, что редактирует .git/config файлы на ваших клонах РЕПО, поэтому они выглядят так вместо этого:

для repo1

[remote "origin"]
        url = "ssh://git@repo1.github.com/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 ключ на машину и РЕПО. У вас будет намного больше ключей для обработки, но вы будете менее уязвимы, если кто-то будет скомпрометирован.