Programmeren is 10% code schrijven en 90% uitzoeken waarom het niet werkt.
Avatar illustratie
TechTalkProgrammerenWebdevelopmentKennis
Gepubliceerd: 19 september 2024

TechTalk: Werken met verschillende Git accounts

Mijn achtergrond ligt in frontend development en webdesign. Ik ontwerp en bouw dus websites. Als ZZP'er doe ik dat vooral voor grotere organisaties waar ik aansluit bij hun development teams, maar voor mezelf bouw ik ook complete websites, zoals het blog dat je nu aan het lezen bent. Het laatste dat je wilt als developer, is dat door bijvoorbeeld een crash van je computer, of een foutje die je zelf maakt, het werk waar je uren, dagen, weken of zelfs maanden mee bezig bent geweest, verloren gaat. Websites bouwen op je computer zonder backupsysteem is dus geen goed plan. Gelukkig is hier een goede tool voor beschikbaar, die nog hartstikke gratis is ook: Git. Als je je bezig gaat houden met programmeren, dan is kennis van Git absoluut onmisbaar. Git is als het ware het communicatiesysteem om met verschillende clouddiensten, waar je veilig je werk kunt opslaan, te kunnen communiceren. Git gebruik je in een terminal, zoals de Command Prompt in Windows, of de geintegreerde terminal in Visual Studio Code (de code editor waar ik zelf mee werk). De clouddienst die ik gebruik is GitHub. Github is een soort backup systeem in de cloud, met zeer uitgebreid versiebeheer. Je slaat zo niet alleen veilig online je werk op, waarbij je altijd weer terug kunt naar eerdere versies, je kunt ook met andere developers aan een project samenwerken, zonder dat je elkaar in de weg zit. Ook kan je vanuit GitHub automatisch deployen naar verschillende bekende hosting services.

Git is een waanzinnig krachtige tool, maar daardoor ook soms ook wel een draak om mee te werken. Aangezien ik zelf aan meerdere projecten werk met verschillende Github accounts en repositories (projecten in het Github account), liep ik tegen een van de uitdagingen aan die Git heeft: Het kan maar bij 1 account tegelijkertijd ingelogd zijn. Ik switch nogal eens tussen projecten, dus dat eindeloze in- en uitloggen ging me vreselijk irriteren. Daarom ben ik gaan zoeken of dit niet efficienter kon en dat bleek te kunnen met zogenoemde SSH keys. Dit bleek uiteindelijk alles behalve makkelijk te gaan en ik ben er meerdere dagen zoet mee geweest om het aan de praat te krijgen. In het verleden heb ik geleerd dit soort dingen direct te documenteren nadat ik het werkend heb gekregen, want je loopt 100% zeker in de toekomst weer tegen hetzelfde probleem aan. Dan ben je inmiddels vergeten hoe je het de vorige keer had opgelost en kan je het weer opnieuw gaan uitzoeken. In deze editie van TechTalk ga ik dus stap voor stap uitleggen hoe je meerdere Github accounts in je computer kunt instellen, zodat je automatisch met het juiste account in de juiste projecten werkt.

In deze tutorial ga ik er vanuit dat je al Git hebt geinstalleerd, je bekend bent met de basis commando's en bekend bent met het werken met een terminal.

SSH keys genereren

Als eerste gaan we SSH keys aanmaken. Deze bestaan uit een public key en een private key en zijn gebonden aan de computer waar je nu op werkt. De public key gaan we later in deze tutorial aan je GitHub account toevoegen, zodat we zonder in te hoeven loggen, verbinding met dat GitHub account kunnen maken. De private key is de sleutel waarmee GitHub jouw computer herkend als legitieme connectie.

  1. Om te beginnen, open een terminal in admin mode, zodat je zeker weet dat je de rechten hebt om alle stappen in deze handleiding te kunnen volgen.
  2. Navigeer naar de .ssh folder. Deze is te vinden in c:/Users/User/.ssh/, waarbij de map ‘User’ een andere naam kan hebben, afhankelijk van hoe het account waarmee je nu aan het werk bent op je computer, is ingesteld.
  3. Voer voor ieder Github account dat je wil gebruiken het volgende commando uit:
    ssh-keygen -t rsa -C "jouw-emailadres" -f "naam-voor-de-key"
    Vul het emailadres in waarmee je je bij je GitHub account hebt geregistreerd. Vul een naam in voor de key die duidelijk omschrijft waarvoor de key is, bijvoorbeeld: github-user1.
  4. De terminal vraagt nu om een passphrase, deze kan je leeg laten. Druk 2 keer op enter. De key wordt nu aangemaakt en zie je in de verkenner in de .ssh map.

Je kunt er ook voor kiezen om een key in te stellen met een passphrase voor extra beveiliging. Als je private key dan wordt gestolen, moet de dief ook de passphrase weten om hem te kunnen gebruiken. Het ‘probleem’ is dat je als je zelf de key gebruikt, ook jij elke keer de passphrase moet invoeren, waardoor je dus toch elke keer weer een soort van opnieuw moet inloggen. Een passphrase is aan te raden als je werkt aan projecten die interessant kunnen zijn voor hackers, maar voor kleine persoonlijke projecten is het niet noodzakelijk en kan je hem leeg laten.

SSH keys aan SSH agent toevoegen

Een SSH agent is als het ware de sleutelbewaarder. Hij houdt bij welke sleutels en wachtwoorden er zijn en gebruikt ze om in te loggen bij de bijbehorende services. We moeten de agent wel eerst vertellen welke sleutels hij voor ons moet bewaren, dus gaan we ze toevoegen. Voer hiervoor de volgende commando’s uit in je terminal:
Get-Service ssh-agent | Set-Service -StartupType Automatic
⁠Start-Service ssh-agent
Get-Service ssh-agent
De laatste regel moet een response geven met een tabel waarin staat wat de status (=running) en naam van de SSH agent is).

Voer nu voor iedere key die je in de vorige stap hebt aangemaakt, het volgende commando uit:
ssh-add C:\Users\User\.ssh\naam-van-de-key
De terminal moet een melding geven met ‘Identity added’.

SSH keys configureren

Nu moeten we de agent nog laten weten bij welke service hij kan inloggen met welke key. Dat doen we door middel van een config bestand. Als je nog niet eerder met SSH keys hebt gewerkt, dan bestaat dan config bestand waarschijnlijk nog niet, dus dat gaan we eerst aanmaken.

  1. In Powershell, controleer of je nog in de .ssh map zit.
  2. Voer het volgende commando uit:
    ni config
    Er is nu een nieuw config bestand aangemaakt.
  3. Open je verkenner en stel in dat verborgen bestanden moeten worden weergegeven. Navigeer vervolgens naar de .ssh map (C:\Users\User\.ssh\). Hier zou je nu het nieuwe config bestand moeten zien staan.
  4. Open het config bestand in een tekst editor zoals Notepad of Notepad++.
  5. Voeg voor elke key het volgende toe in de config:
#Naam/Omschrijving account
⁠Host github-user2
⁠    HostName github.com
⁠    User git
⁠    IdentityFile C:\Users\User\.ssh\github-user2

Maak van 1 account de default user en zet voor dat account de host en hostname op github.com. Die entry moet er zo uitzien in de config file:

#Naam/Omschrijving account
⁠Host github.com
⁠    HostName github.com
⁠    User git
⁠    IdentityFile C:\Users\User\.ssh\github-user1

Zet dit account bovenaan in de config file, zodat meteen duidelijk is welk account default is.

Indien er geen github.com Host aanwezig is in de conig file, kan het zijn dat er geen contact met de remote repository gemaakt kan worden, omdat de verkeerde key wordt gebruikt om in te loggen. Het authentiseren van de user lukt dan wel, maar fetch, pull en push geven dan een error.

Public SSH key aan GitHub toevoegen

Het werd eerder in deze tutorial al even genoemd: We gaan nu de public key toevoegen aan het bijbehorende GitHub account, zodat GitHub straks weet dat jouw computer een legitieme connectie is en toegang krijgt tot je repositories.

  1. Open in je browser github.com en log in met het gewenste account.
  2. Klik rechtsboven op het user-icoontje en dan op ‘Settings’.
  3. Klik in het menu aan de linkerkant op ‘SSH and GPG keys’.
  4. Klik op ‘New SSH key’.

Er verschijnt nu een formuliertje met 3 velden. Vul bij ‘Title’ een naam in die duidelijk omschrijft dat de key van jouw computer is. Deze key is namelijk lokaal en bestaat dus alleen op de computer die je nu gebruikt. Voor andere apparaten moet je nieuwe keys aanmaken op dat specifieke apparaat. Het ‘Key type’ veld staat al goed, dat kan je zo laten. In het ‘Key’ veld, voer je de inhoud van je pulic key in. Dat doe je als volgt:

  1. Ga in de verkenner naar C:/Users/User/.ssh
  2. Open de gewenste public key in een tekst editor zoals Notepad of Notepad++. De public key is het bestand met de .pub extensie (de andere, zonder extensie, is de private key).
  3. Kopieer de inhoud van het bestand en plak dit in het ‘Key’ veld op de GitHub website.
  4. Klik ‘Add SSH key’.

De key moet nu in het overzicht staan.

Koppel GitHub repositories aan lokale projecten

Gefeliciteerd! Je kunt nu (in theorie) met verschillende GitHub accounts aan je projecten werken.

Een Repository klonen

Als je je github repo nog niet naar je computer hebt gekloond, dan kan je dat doen met het volgende commando:
git clone git@[host]:[github-user]/[repository].git

[host]: In het config bestand heb je een waarde ingevuld bij Host (de eerste regel van ieder blok), die vul je hier in (zonder []).
⁠[github-user]: Dit je GitHub gebruikersnaam.
⁠[repository]: Dit is de naam van de repository die je gaat klonen.

Let op dat je eerst met de terminal naar de map navigeert waar je je project lokaal wilt opslaan en dat je de juiste Host met het juiste GitHub account combineert.

Als het is gelukt om je project te klonen, volg dan de stappen hieronder om te controleren of de lokale Git config goed staat.

Een bestaande lokale repository instellen

Als je al een project op je computer had draaien, moet je dat project nog koppelen aan het juiste GitHub account. Dit doe je als volgt:

  1. Ga in je verkenner naar de map waarin je project staat.
  2. Zorg dat verborgen bestanden worden weergegeven.
  3. Open de .git map en open het bestand ‘config’ in een tekst editor zoals Notepad/Notepad++.
  4. De inhoud van dit bestand moet er als volgt uitzien:
[core]
    ⁠repositoryformatversion = 0
⁠    filemode = false
    ⁠bare = false
⁠    logallrefupdates = true
⁠    symlinks = false
⁠    ignorecase = true
    ⁠sshCommand = ssh -i ~/.ssh/key-name
⁠[user]
⁠    name = username
    ⁠email = user@email.com
⁠[remote "origin"]
    ⁠url = git@host:user/repository.git
    ⁠fetch = +refs/heads/*:refs/remotes/origin/*
⁠[branch "master"]
    ⁠remote = origin
    ⁠merge = refs/heads/master

[core]: Alles hier is automatisch gegenereerd toen je je project aanmaakte (mits je daarbij ook een Git repository hebt aangemaakt). Je kunt wat er al staat, laten zoals het is.
Voeg aan het einde van de core sectie de sshCommand regel toe, zoals je die hierboven ziet. ‘key-name’ is de naam van de key die je voor dit account hebt aangemaakt.
⁠[user]: Voer de username en het emailadres van het GitHub account in waar je naar wilt gaan pushen.
[remote "origin"]: Je repository op GitHub. Deze regel moet ook weer je GitHub username bevatten, en de host die je in de /.ssh/config hebt aangemaakt, dus: git@hostInConfig:githubGebruikersnaam/naamVanDeRepository.git
⁠[branch "master"]: De naam van je branch. In het voorbeeld is dit ‘master’, in jouw geval kan dat ook ‘main’ of een andere branchnaam zijn. Let er ook op dat de branchnaam ook achter de laatste / bij ‘merge’ staat.

Testen of het werkt

Alle stappen zijn nu gezet om met de verschillende accounts aan het werk te kunnen. Nu is het tijd om te testen of alles goed werkt.

Instellingen lokale project

Om de instellingen van je lokale repository/project te zien, Doe je het volgende:

  1. Navigeer met de terminal naar de map waar je project in staat.
  2. Voer het volgende commando uit in de terminal van je editor:
    git config –list
    Deze settings moeten kloppen, dus hier moet je de juiste GitHub repository zien als remote en je moet de daarbij behorende user zien. Deze data komt uit het lokale Git config bestand binnen dit project.

Gebruiker authentiseren

Gebruik dit commando om te zien of je kunt authentiseren met je SSH key:
⁠ssh -T hostInConfig

HostInConfig is de naam die je hebt gedefinieerd in de global /.ssh/config file. Dus niet wat er bij ‘HostName’ staat, maar dat wat er bij ‘Host’ staat, de bovenste regel van het blok.

De eerste keer dat je dit doet kan het zijn dat je een melding krijgt dat de connectie nog niet als known_host bekend is en of je wilt doorgaan. Je kunt dan ‘yes’ intypen en op enter drukken.

Als alles goed is gegaan, zou je nu een melding moeten krijgen dat de juiste user ‘successfully authenticated’ is. Je kunt deze query herhalen voor iedere key die je hebt ingesteld en die in de global config is gedefinieerd.

Remote repository testen

Als laatste test je of je verbinding kunt maken met de remote repository. Probeer te fetchen:
git fetch

Als dit goed gaat, krijg je geen melding. Er verschijnt na maximaal een paar seconden een nieuwe lege regel in de terminal, verder niets.

Als het niet lukt om te fetchen, dan krijg je een error melding te zien. Helaas is Git best wel lastig, dus als je in deze stap een error krijgt, dan wordt het toch even flink Googlen helaas. Op Stackoverflow kan je verschillende topics vinden over problemen met het verbinden met git, net als op de website van github zelf.

Om nog te dubbelchecken of de verbinding werkt, kan je checken of je key is gebruikt door naar je GitHub account te gaan en vervolgens naar ‘Settings’ en ‘SSH and GPG keys’ (daar waar je je public key eerder hebt toegevoegd). Als de verbinding werkt zie je hier, bij de betreffende public key: Last used within the last week. Zo niet, dan zal er staan: Never used.

Reageer op deze post

Versturen

Reacties op deze post

Er zijn nog geen reacties op deze blogpost