Git-synkronisering (Git sync) er en funktion i PowerShell Universal. Den opretter commits ud fra ændringer i konfigurationsrepositoriet i PowerShell Universal og pusher og puller dem fra et git-remote. Git sync giver ensartet konfiguration i en PowerShell Universal-klynge med høj tilgængelighed, eller den kan flytte ændringer fra et udviklingsmiljø til produktion via pull requests og branches. Selv i et miljø med én node er den nyttig til at bevare en historik over ændringer.
Hvordan virker Git sync?
Git sync virker ved at køre kommandoerne git pull og git push med et fast interval, så konfigurationsfilerne holdes ajour med det eksterne git-repositorium. Som standard kører Git sync-processen hvert minut for at hente ændringer fra git-remote. Når det gælder brugerinteraktion, arbejder Git sync i to forskellige tilstande.
Manuel tilstand
Standardtilstanden er manuel tilstand (Manual mode). I den tilstand er PowerShell Universal-serveren i praksis skrivebeskyttet, indtil en bruger klikker på knappen Edit i administrationskonsollen. Brugeren kan derefter foretage ændringer i hele administrationskonsollen. Når ændringerne er færdige, kan brugeren angive en commit-besked og pushe ændringerne til remote, hvorefter serveren igen bliver skrivebeskyttet. Mens brugeren redigerer konfigurationsfilerne, puller Git sync-processen ikke fra remote.
Bemærk, at processen i manuel tilstand ændrer tilstanden for hele serveren. Hvis flere administratorer ændrer serveren på samme tid, skal de være opmærksomme på, at deres ændringer ikke er isoleret til deres egen konto.
Automatisk tilstand
Den anden tilstand er automatisk tilstand (Automatic mode). I den tilstand kan der skrives til PowerShell Universal-serveren, og alle ændringer bliver committet og pushet direkte til git-remote. I den tilstand kan brugeren ikke angive en commit-besked, men behøver heller ikke bekymre sig om at gå ind og ud af redigeringstilstand.
Indstillinger for Git sync
Ud over hvordan brugeren arbejder med git, kan Git sync-processen også konfigureres til at tale med et git-remote på tre forskellige måder.
Use Database
Indstillingen Use Database gemmer git-repositoriet direkte i PSU-databasen. Det kan forenkle Git sync, fordi du slipper for at sætte et git-remote op som GitHub eller Bitbucket og for at håndtere netværk og legitimationsoplysninger. Use Database kræver, at kommandolinjeværktøjet git.exe, eller en platformsbestemt git-version, er installeret på PowerShell Universal-systemet. Indstillingen bruger git bundle til at oprette og gemme bundles direkte i databasen. Ulempen ved den konfiguration er, at git-repositoriet ikke er let tilgængeligt for tredjepartsværktøjer.
Du kan læse mere om git bundle.
Intern git-klient
PowerShell Universal har en intern git-klient, der kan pushe og pulle fra eksterne repositorier. Klienten, LibGit2Sharp, wrapper et C-baseret git-klientbibliotek. Den har ikke den fulde funktionalitet fra git.exe, men kræver ingen installation af en git-klient på PSU-serveren. Du kan angive legitimationsoplysninger i git-indstillingerne i PowerShell Universal, som bruges sammen med git-klientbiblioteket.
Fordi det interne git-klientbibliotek kræver bestemte implementeringer i PSU-serveren, er funktionaliteten begrænset i forhold til den eksterne git-klient. For de fleste brugere er den dog tilstrækkelig. Nogle begrænsninger er:
- Manglende understøttelse af SSH
- Ingen integration med git credential helpers
- Begrænset brug af git config
For at konfigurere den interne git-klient skal du fjerne fluebenet ved Use Database og indsætte URL’en til dit git-remote og dine legitimationsoplysninger.
Ekstern git-klient
PowerShell Universal integrerer også med kommandolinjeprocessen for den eksterne git-klient. Git-kommandoer som git push, git pull og git commit kaldes direkte via en ekstern git.exe-proces. Når du bruger integrationen med den eksterne git-klient, sender PowerShell Universal ikke legitimationsoplysninger til git-kommandoerne, så du skal angive dem på en anden måde.
Du kan angive legitimationsoplysninger på følgende måder.
URL
Du kan bruge et brugernavn og en adgangskode (eller et personal access token) direkte i URL’en med følgende syntaks. Formatet kræver ingen yderligere git-konfiguration, men gemmer URL’en i klartekst i databasen.
https://adam:PAT@github.com/ironmansoftware/shiny-octowaffle.git
Git credential helper
Du kan også bruge en git credential helper til at gemme legitimationsoplysninger til bestemte repositorier i git. PowerShell Universal integrerer ikke direkte med credential helpers, men du kan konfigurere dem uden for PSU-miljøet, og når Git sync-processen kører, bruges legitimationsoplysningerne af git.exe selv.
Du kan læse mere om git credentials. Bemærk, at git-konfiguration, der er brugerspecifik, skal lægges i profilen for den tjenestekonto, PSU kører under.
Privat SSH-nøgle
Ligesom med git credential helper kan du også gemme en privat SSH-nøgle til git, som PSU-git-klienten kan bruge. De fleste git-repositorier tillader, at du uploader egne offentlige nøgler til at få adgang til git-repos i stedet for med legitimationsoplysninger.
Som eksempel kan du følge dokumentationen om SSH-konfiguration til GitHub.
Yderligere indstillinger
Ud over legitimationsoplysninger indlæser Git sync-processen i PowerShell Universal alle ændringer af enten de brugerlokale eller de globale git-indstillinger. Indstillingerne kan omfatte ting som SSL-cryptobackend, linjeafslutninger og whitespace.
Opsætning af Git sync
Git sync sættes op ved at konfigurere git-indstillingerne enten i filen appsettings.json eller via dialogboksen Git Settings under Settings > Git. Der er flere konfigurationsmuligheder, du skal kende, når du sætter Git sync op. Vi anbefaler databasen, når det er muligt. Det gør det lettere at konfigurere flere noder til at bruge de samme git-indstillinger, når de deler en database.
Oplysninger om legitimationsoplysninger
De fleste git-repositorier bruger en form for personal access token. Personal access tokens kan bruges som adgangskoder og skal behandles som sådan, men de kan også begrænses i omfang og tilbagekaldes fra serveren, når det er nødvendigt. Det er vores foretrukne metode til legitimationsoplysninger.
Det er også muligt at bruge dit brugernavn og din adgangskode direkte.
Første synkronisering
Først skal du kende det første push eller pull fra et git-remote. Bemærk, at selv om der findes en init-adfærd, er indstillingen ikke længere nødvendig og kan ignoreres. Den fjernes i en senere version.
Filer lokalt
Hvis du ikke har konfigureret Git sync før, er det det mest almindelige scenarie. Du har lokale konfigurationsfiler, som du vil gemme i et git-remote. Git-remote skal være bart. Der bør ikke være oprettet branches, men repositoriet skal findes. I det scenarie initialiserer PowerShell Universal et lokalt git-repositorium, opretter den angivne branch og initialiserer derefter remote via et git push.
Efter den første synkronisering findes de lokale filer i remote.
Filer i remote
Hvis du har et git-remote, der allerede har en branch med filer, skal du sikre, at konfigurationsrepositoriet i PowerShell Universal er tomt på den lokale server. Hvis der findes filer, fejler den første Git sync. Hvis mappen ikke findes, kaldes git clone på den angivne branch, og filerne hentes lokalt. PowerShell Universal konfigurerer sig derefter igen ud fra de hentede filer.
Interval for Git sync
Som standard kører Git sync-processen hvert minut for at tjekke efter ændringer, der kan være pushet til git-remote. Der køres et git pull, og derefter sammenlignes det aktuelle HEAD-commit på branchen med SHA’en for det seneste Git sync-commit. Hvis SHA’en for HEAD-committet er anderledes end den forrige commit-SHA, genindlæser konfigurationssystemet i PowerShell Universal de ændrede filer.
Synkroniseringsadfærd
Der findes tre synkroniseringsadfærd i PowerShell Universal. De ændrer, hvordan PowerShell Universal taler med det eksterne git-repositorium.
Tovejs
I tovejs-tilstand (Two-way) udføres et git pull og et git push ved hver Git sync. PowerShell Universal-instansen er læse-skrive.
Envejs
I envejs-tilstand (One-way) udføres et git pull ved hver Git sync. PowerShell Universal-instansen er skrivebeskyttet. Det er nyttigt i produktionsmiljøer, hvor ændringer kommer via pull requests og ikke laves direkte på PowerShell Universal-serveren.
Kun push
I tilstanden kun push (Push-only) udføres et git push, hvis der er ændringer, ved hver Git sync. PowerShell Universal-instansen er læse-skrive, men puller ikke ændringer fra remote. Det er nyttigt, når du redigerer filer i et debug-miljø, hvor du ikke vil håndtere merge-konflikter fra ændringer, der kommer fra remote.
Almindelige problemer
Her er nogle almindelige problemer, du kan støde på med Git sync.
Merge-konflikter
PowerShell Universal håndterer ikke merge-konflikter, og de kræver manuel indgriben. Derfor kan det være ønskeligt at have produktionsmiljøer i envejs Git sync for at undgå lokale ændringer. Alle ændringer og merges laves med de git-værktøjer, der findes i git-repositoriet, eller i andre lokale udviklingsmiljøer.
Hvis du vil have et produktionsmiljø med læse/skrive og flere noder, anbefales det at sætte flere envejs-noder op og én tovejs-node.
Hvis du støder på en merge-konflikt, skal du redigere filerne direkte på PSU-serveren for at løse konflikten.
Godkendelsesproblemer
Hver git-remote-server er lidt forskellig. Bitbucket har for eksempel flere niveauer af HTTP-tokens, og du skal sikre, at de er konfigureret korrekt, før du kan bruge dem mod dine repositorier. Vi anbefaler, at du kan klone repositorier med en almindelig git-klient, før du prøver at bruge et token i PowerShell Universal. Hvis du vil teste legitimationsoplysninger i PowerShell Universal, kan du bruge knappen Synchronize Now på Git-siden til at bekræfte adgangen uden at vente på den planlagte Git sync.
SSL-problemer
Den interne git-klient tillader ikke accept af certifikater, der ikke er tillid til. Hvis din server har problemer med SSL-forbindelser, kan du være nødt til at konfigurere en ekstern git-klient og sætte de rigtige git config-indstillinger for at undgå fejl og acceptere de usikkerheder, ændringerne kan medføre.
Git hænger
Som standard venter Git sync-processen i PowerShell Universal 60 sekunder på, at git.exe-processen afsluttes. På visse systemer kan git åbne en brugerflade til legitimationsoplysninger. Det kan få Git sync til at hænge og fejle.
Klar til at bygge? Download PowerShell Universal.

Adam Driscoll