Załóżmy, że alice
jest użytkownikiem github.com z 2 lub więcej prywatnymi repozytoriami repoN
. W tym przykładzie będziemy pracować tylko z dwoma repozytoriami o nazwach repo1
irepo2
https://github.com/alice/repo1
https://github.com/alice/repo2
Musisz pobierać z tych repozytoriów bez wprowadzania haseł prawdopodobnie na serwerze lub na wielu serwerach. Chcesz git pull origin master
na przykład wykonać i chcesz, aby tak się stało bez pytania o hasło.
Nie lubisz zajmować się agentem ssh, odkryłeś (lub odkrywasz teraz) ~/.ssh/config
plik, który pozwala Twojemu klientowi ssh wiedzieć, jakiego klucza prywatnego użyć w zależności od nazwy hosta i nazwy użytkownika, z prostym wpisem konfiguracji, który wygląda jak to:
Host github.com
HostName github.com
User git
IdentityFile /home/alice/.ssh/alice_github.id_rsa
IdentitiesOnly yes
Więc poszedłeś naprzód i stworzyłeś (alice_github.id_rsa, alice_github.id_rsa.pub)
parę kluczy, następnie również poszedłeś do .git/config
pliku repozytorium i zmodyfikowałeś adres URL swojego pilota tak, origin
aby wyglądał mniej więcej tak:
[remote "origin"]
url = "ssh://git@github.com/alice/repo1.git"
I w końcu poszedłeś do Settings > Deploy keys
sekcji repozytorium i dodałeś zawartośćalice_github.id_rsa.pub
W tym momencie możesz zrobić to git pull origin master
bez wprowadzania hasła bez problemu.
ale co z drugim repozytorium?
Instynkt repo2
polega więc na złapaniu tego klucza i dodaniu go do kluczy Wdróż, ale github.com popełni błąd i powie, że klucz jest już używany.
Teraz idź i wygeneruj kolejny klucz ( ssh-keygen -t rsa -C "alice@alice.com"
oczywiście bez użycia haseł), a żeby to nie stało się bałaganem, teraz nadasz swoim kluczom następujące nazwy:
repo1
para kluczy: (repo1.alice_github.id_rsa, repo1.alice_github.id_rsa.pub)
repo2
para kluczy: (repo2.alice_github.id_rsa, repo2.alice_github.id_rsa.pub)
Teraz umieścisz nowy klucz publiczny w repo2
konfiguracji Wdróż klucze na github.com, ale teraz masz problem z ssh do rozwiązania.
W jaki sposób ssh może określić, którego klucza użyć, jeśli repozytoria są hostowane w tej samej github.com
domenie?
Twój .ssh/config
plik wskazuje github.com
i nie wie, którego klucza użyć, gdy nadejdzie czas, aby wykonać ściąganie.
Więc znalazłem sztuczkę z github.com. Możesz powiedzieć klientowi ssh, że każde repozytorium mieszka w innej subdomenie github.com, w takich przypadkach będą one repo1.github.com
irepo2.github.com
Pierwszą rzeczą jest edycja .git/config
plików na klonach repo, więc zamiast tego wyglądają tak:
Do repo1
[remote "origin"]
url = "ssh://git@repo1.github.com/alice/repo1.git"
Do repo2
[remote "origin"]
url = "ssh://git@repo2.github.com/alice/repo2.git"
A potem w .ssh/config
pliku będziesz mógł wprowadzić konfigurację dla każdej subdomeny :)
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
Teraz możesz to zrobić git pull origin master
bez wprowadzania haseł z obu repozytoriów.
Jeśli masz wiele komputerów, możesz skopiować klucze do każdego z nich i użyć ich ponownie, ale radzę wykonać pracę nóg, aby wygenerować 1 klucz na maszynę i repozytorium. Będziesz miał o wiele więcej kluczy do obsługi, ale będziesz mniej podatny na ataki, jeśli ktoś zostanie przejęty.