Git 🌙
Chapters â–Ÿ 2nd Edition

4.1 Git pÄ servern - Protokollen

Nu bör du kunna göra det mesta av dina dagliga arbetsuppgifter som krĂ€ver Git. För att kunna samarbeta med andra i Git, behöver du ett fjĂ€rrepo dit du kan skicka ditt arbete. FastĂ€n du rent tekniskt kan skicka och hĂ€mta Ă€ndringar frĂ„n individers egna repon, Ă€r detta inte att föredra eftersom det med lĂ€tthet kan skapa förvirring kring vad man sjĂ€lv jobbar med om man inte Ă€r försiktig. Vidare vill du att dina medarbetare skall kunna nĂ„ repot Ă€ven om din dator inte Ă€r pĂ„slagen — ett mer tillförlitligt gemensamt repo Ă€r dĂ€rför ofta anvĂ€ndbart. DĂ€rför Ă€r det föredragna arbetssĂ€ttet för att samarbeta med nĂ„gon att sĂ€tta upp ett intermediĂ€rt repo som ni bĂ„da har tillgĂ„ng till och skicka och hĂ€mta Ă€ndringar dĂ€rifrĂ„n.

Att köra en Gitserver Àr ganska rÀttframt. Först mÄste du vÀlja vilka protokoll du vill att din server stödjer. Det första avsnittet av detta kapitlet kommer behandla tillgÀngliga protokoll samt för- och nackdelar av dem. Efterföljande avsnitt kommer beskriva nÄgra typiska installationer som anvÀnder protokollen och hur dÄ fÄr din server att anvÀnda dem. Sist kommer vi att gÄ igenom lite leverantörslösningar om du inte har nÄgot emot att ha din kod pÄ nÄgonannans server och inte vill gÄ igenom krÄnglet med att sÀtta upp och underhÄlla din egen server.

Om du inte har nÄgot intresse av att köra din egen server, kan du hoppa till sista avsnittet av kapitlet för lite valmöjligheter att sÀtta upp ett tjÀnstekonto hos nÄgra leverantörer och dÀrefter gÄ vidare till nÀsta kapitel. DÀr kommer vi att diskutera olika in- och utgÄngar av att jobba i en miljö med distribuerad versionshantering.

Ett fjĂ€rrepo Ă€r generellt ett bart förvar — ett Git repo som inte har nĂ„got arbetstrĂ€d. Eftersom repot bara anvĂ€nds för samarbetsknutpunkt finns det ingen anledning att ha en ögonblicksbild utcheckad pĂ„ disken; det Ă€r bara sjĂ€lva Gitdatan. I enklaste termer Ă€r ett bart förvar bara innehĂ„llet av ditt projekts .git-katalog och inget annat.

Protokollen

Git kan anvÀnda fyra olika protokoll för att överföra data: Lokalt, HTTP, SSH samt Git. HÀr kommer vi gÄ igenom vad de Àr och under vilka omstÀndigheter du vill (eller inte vill) anvÀnda dem.

Lokala protokollet

Det mest grundlÀggande Àr det lokala protokollet, i vilket fjÀrrförvaret Àr i en annan katalog pÄ samma dator. Detta anvÀnds ofta om alla i dit team har tillgÄng till ett gemensamt filsystem sÄsom en NFS-montering, eller i det mindre vanliga fallet att alla loggar in pÄ samma dator. Det sistnÀmnda Àr inte idealt, eftersom alla dina repoinstanser finns pÄ samma dator, vilket utgör en ökad risk för en katastrofal dataförlust.

Om du har ett delat filsystem kan du klona, skicka till och hÀmta frÄn ett lokalt filbaserat repo. För att klona ett repo pÄ detta sÀttet, eller att lÀgga till en fjÀrförvar till ett existerande projekt, anvÀnder du sökvÀgen till repot som URL. Till exempel, för att klona ett lokalt repo kan du göra nÄgot i stil med:

$ git clone /srv/git/project.git

Eller sÄ kan du göra sÄhÀr:

$ git clone file:///srv/git/project.git

Git jobbar nĂ„got olika om du explicit specificerar file:// i början av URL:en. Om du bara specificerar sökvĂ€gen, kommer Git att försöka anvĂ€nda hĂ„rda lĂ€nkar eller att direkt kopiera filerna som behövs. Om du specificerar file://, kommer Git att starta den process som den normalt anvĂ€ndef för att överföra data över nĂ€tverk, vilken generellt Ă€r midre effektiv. Huvudanledningen att specificera prefixet file:// Ă€r oim du vill ha en ren kopia av repot med irrelevanta referenser eller objekt som lĂ€mnats kvar — normalt efter import frĂ„n ett annat versionshanteringssystem eller liknande (se Git Internals för underhĂ„llsuppgifter). Vi anvĂ€nder vanliga sökvĂ€gar hĂ€r eftersom det nĂ€stan alltid gĂ„r fortare.

För att lÀgga till ett lokalt repo till ett existerande Gitprojekt, kan du göra nÄgot i stil med detta:

$ git remote add local_proj /srv/git/project.git

DÄ kan du skicka och hÀmta data frÄn det fjÀrrförvaret via ditt nya fjÀrrnamn local_proj, som om du gjorde det över nÀtverket..

Fördelarna

Fördelarna med filbaserade repon Àr att de Àr enkla och anvÀnder existerande filrÀttigheter och nÀtverksÄtkomst. Om du redan har ett delat filsystem till vilket hela teamet har Ätkomst Àr det vÀldigt enkelt att sÀtta upp ett repo. Du lÀgger den bara repokopian nÄgonstans dit alla har delad Ätkomst och sÀtter lÀs- och skrivrÀttigheter som du skulle gjort för vilken annan delad mapp som helst. Vi diskuterar hur man exporterar en bar repokopia för detta ÀndamÄl i Skaffa Git pÄ en server.

Detta Àr ocksÄ ett trevligt alternativ för att snabbt hÀmta arbete frÄn nÄgon annans arbetsrepo. Om du och en medarbeterare jobbar pÄ samma projekt och de vill att du skall titta pÄ nÄgot, Àr det ofta enklare att köra ett kommando som git pull /home/john/project Àn att de skall skicka upp sina Àndringar till en fjÀrrserver och att du sedan hÀmtar dem dÀrifrÄn.

Nackdelarna

Nackdelarna med denna metod Àr att delad Ätkomst generellt Àr svÄrare att konfigurera och nÄ frÄn flera stÀllen Àn ren och skÀr nÀtverksÄtkomst. Om du vill skicka Àndringar frÄn din bÀrbara dator nÀr du Àr hemma mÄste du montera nÀverksdisken, vilket kan vara svÄrt och lÄngsamt jÀmfört med nÀtverksbaserad Ätkomst.

Det Àr viktigt att nÀmna att detta nödvÀndigtvis inte Àr det snabbaste valet om du anvÀnder en delad nÀtverksdisk av nÄgot slag. Ett lokalt repo Àr bara snabbt om du har snabb Ätkomst till datan. Ett repo pÄ en nÀtverksdisk Àr ofta lÄngsammare Àn repo över SSH pÄ samma server, som gör att Git kan köra frÄn lokala diskar pÄ varje system.

Slutligen, detta protokollet skyddar inte repot mot oavsiktlig skada. Varje anvĂ€ndare ha full skalĂ„tkomst till “fjĂ€rr”-mappen och det finns inget som hindrar dem frĂ„n att Ă€ndra eller ta bort interna Gitfiler och korrumpera repot.

HTTP-protokollen

Git kan kommunicera över HTTP via tvÄ olika lÀgen. Före Git 1.6.6 var det bara ett sÀtt som var vÀldigt simpelt och generellt endast med lÀsÄtkomst. I version 1.6.6 introducerades ett nytt smartare protokoll som innebÀr att Git kan förhandla dataöverföring pÄ ett sÀtt som liknar hur det gör över SSH. De senaste Ären har det nya protokollet blivit vÀldigt populÀrt eftersom det Àr enklare för anvÀndaren och smartare i hur den kommunicerar. Den nya versionen refereras ofta till som det Smart HTTP och det Àldre sÀttet som dum HTTP. Vi behandlar det nya smarta HTTP protokollet först.

Smart HTTP

Smart HTTP fungerar vÀldigt likt SSH- och Gitprotokollen men kör över vanliga HTTPS-portar och kan anvÀnda olika HTTP-autentiseringsmekanismer, vilket betyder att det oftast Àr enklare för anvÀndaren Àn nÄgot som SSH eftersom du kan anvÀnda autentisera med anvÀndarnamn och lösenord snarare Àn konfigurera SSH-nycklar.

Det har förmodligen blivit det vanligaste sÀttet att anvÀnda Git nu, eftersom det kan konfigureras för att hantera anonyma Ätkomst som git:// protokollet, men ocksÄ att skicka data med autentisering och kryptering som SSH-protokollet. IstÀllet för att konfigurera olika URL:er för dessa saker, kan du anvÀnda en enda URL för bÀgge. Om du försöker skicka och repot krÀver autentisering (vilket bör vara normalt förfarande) kan servern frÄga efter anvÀndarnamn och lösenord. Detsamma gÀller för lÀsÄtkomst.

Faktum Àr att för tjÀnster som GitHub Àr URL:en som du anvÀnder för att visa repot online (till exempel https://github.com/schacon/simplegit) Àr samma URL som du kan anvÀda att klona med och, om du har Ätkomst, skicka via.

Dum HTTP

Om server inte svarar med med en Smart HTTP Git tjÀnst, kommer Gitklienten att försöka falla tillbaka till det enklare dumma HTTP. Det dumma protokollet förvÀntar sig att det bara Gitrepot kommer att sÀndas som normala filer frÄn webservern. Det fina i krÄksÄngen med Dum HTTP Àr enkelheten att konfigurera det. I praktiken behöver du du bara lÀgga ditt Gitrepo under di dokumentroten för din HTTP-server och konfigurera en specifik post-update krok, och du Àr klar (se Git Hooks). NÀr du gjort det, kan alla med Ätkomst till din webserver dit du lade ditt repo ocksÄ klona det. För att tillÄta lÀsrÀttigheter för ditt repo över HTTP, gör nÄgot i stil med detta:

$ cd /var/www/htdocs/
$ git clone --bare /path/to/git_project gitproject.git
$ cd gitproject.git
$ mv hooks/post-update.sample hooks/post-update
$ chmod a+x hooks/post-update

Det Àr allt. Kroken post-update som normalt kommer med Git kör ett lÀmpligt kommando (git update-server-info) för att göra hÀmtning frÄn och kloning av HTTP repon att fungera korrekt. Detta kommando körs nÀr du skickar till detta repo (kanske via SSH), dÄ kan andra folk klona ungefÀr sÄhÀr

$ git clone https://example.com/gitproject.git

I detta specifika fallet anvĂ€nder vi sökvĂ€gen var/www/htdocs som Ă€r vanlig för Apachekonfigurationer, men du kan anvĂ€nda vilken statisk webserver som helst — lĂ€gg bara det bara repot pĂ„ dess plats. Gitdata skickas som vanliga statiska filer (se kapitlet Git Internals för detaljer kring exakt hur det gĂ„r till).

I gemen vÀljer du enkom att köra en Smart HTTP server med lÀs- och skrivrÀttigheter eller bara tillgÀngliggöra filerna för lÀsning via dum HTTP. Det Àr ovanligt att anvÀnda en mix av de tvÄ metoderna.

Fördelarna

Vi koncentrerar oss pÄ fördelarna hos den Smarta versionen av HTTP.

Enkelheten med att ha en enda URL för alla typer av Ätkomst och att servern sjÀlv frÄgar om autentisering krÀvs gör saken enklare för slutanvÀndaren. Att tillÄta autentisering med anvÀndarnamn och lösenord Àr en stor fördel jÀmfört med SSH, eftersom anvÀndare inte behöver generera SSH-nycklar lokalt och ladda upp sin publika nycklar till servern innan man kan interagera med den. För modre sofistikerade anvÀndare, eller anvÀndare pÄ system dÀr SSH Àr mindre vanligt, Àr detta en stor fördel i anvÀndarvÀnlighet. Det Àr ocksÄ ett vÀldigt snabbt och effektivt protokoll, i paritet med SSH.

Du kan ocksÄ tillgÀngliggöra dina repon med enbart lÀsÄtkomst över HTTPS, vilket betyder att du kan kryptera innehÄllet innan överföringen eller sÄ kan du gÄ sÄ lÄngt att krÀva signerade SSL-certifikat av klienterna.

En annan trevlik sak Àr att HTTPS Àr sÄ mycket mer vÀlanvÀnt vilket gör att företagens brandvÀggar ofta Àr konfigurerade för att tillÄta trafik genom dess portar.

Nackdelarna

Git över HTTPS kan vara lite mer trixigt att konfigurera jÀmfört med SSH pÄ nÄgra servrar. Utöver det finns det vÀldigt fÄ fördelar som andra protokoll har över Smart HTTP nÀr det kommer till att förmedla Gitdata.

Om du anvÀnder HTTP för autentisering vid skickande av data Àr det ibland mer komplicerat att ange dina inloggningsuppgifter Àn att anvÀnda nycklar över SSH. Det finns dock flera verktyg som sparar inloggningsuppgifter, inklusive Keychain pÄ macOS och Credential Manager pÄ Windows, för att göra detta ganska smÀrtfritt. LÀs Credential Storage för att se hur du kan konfigurera sÀkra sÀtt att spara inloggningsuggifter för HTTP pÄ ditt system.

SSH-protokollet

Ett vanligt transportprotokoll för Git nĂ€r man driftar miljön sjĂ€lv Ă€r över SSH. Detta eftersom SSH-Ă„tkomst till servrar ofta Ă€r konfigurerat pĂ„ de flesta stĂ€llen — och om det inte Ă€r det Ă€r det lĂ€tt att göra. SSH Ă€r ocksĂ„ ett autentiserat nĂ€verksprotokoll och, eftersom det Ă€r allmĂ€nt förekommande, Ă€r lĂ€tt att konfigurera och anvĂ€nda.

För att klona ett Gitrepo över SSH sÄ kan du specificera ssh:// i URL:en som sÄhÀr:

$ git clone ssh://[user@]server/project.git

Eller sÄ kan du anvÀnda det kortare scp-liknande syntaxen för SSH-protokollet:

$ git clone [user@]server:project.git

I bÄda fall ovan antar Git att du autentiserar dig som den anvÀndare du Àr inloggad som, om du inte specificerar anvÀndarnamn.

Fördelarna

Fördelarna att anvĂ€nda SSH Ă€r mĂ„nga. Först av allt sĂ„ Ă€r SSH relativt enkelt att konfigurera — SSH-daemoner Ă€r vardagsmat, mĂ„nga nĂ€tverksadministratörer har erfarenhet av dem, och mĂ„nga OS-distributioner Ă€r konfigurerade med dem eller har verktyg för att hantera dem. För det andra Ă€r Ă„tkomst över SSH sĂ€ker — all dataöverföring Ă€r krypterad och autentiserad. Slutligen, likt HTTPS, Git och lokala protokollen, Ă€r SSH effektivt, vilket gör data sĂ„ kompakt som möjligt innan överföringen.

Nackdelarna

Den negativa aspekten av SSH Àr att det inte tillÄter anonym Ätkomst till ditt Gitrepo. Om du anvÀnder SSH, mÄste folk ha SSH-Ätkomst till din maskin, Àven vid enbart lÀsrÀttigheter, vilket gör att SSH inte Àr smidigt för öppen kÀllkodsprojekt i vilka folk helt enkelt vill klona ditt repo för att undersöka det. Om du bara anvÀnder det inom ditt företags nÀtverk kan SSH vara det enda protokoll du behöver handskas med. Om du vill tillÄta anonym lÀsÄtkomst till dina projekt och ocksÄ vill anvÀnda SSH, behöver du konfigurera SSH för dig att skicka data över, men nÄgot annat för andra att hÀmta frÄn.

Gitprotokollet

Slutligen har vi Gitprotokollet. Detta Ă€r en speciell daemon som kommer packeterad med Git och som lyssnar pĂ„ en dedikerad port (9418) som tillhandahĂ„ller enb tjĂ€nst liknande SSH-protokollet, men utan autentisering. För ett repo för att tillhandahĂ„llas över Gitprotokollet, mĂ„ste du skapa en git-daemon-export-ok-fil — daemonen kommer inte tillgĂ€ngliggöra repo utan den filen — men Ă„ andra sidan finns det ingen sĂ€kerhet. Antingen Ă€r gitrepot tillgĂ€ngligt för alla att klona eller sĂ„ Ă€r det inte det. Detta betyder att man generellt inte skickar upp data över detta protokollet. Du kan tillĂ„ta skrivaccess men eftersom det inte finns nĂ„gon autentisering kan vem som helst pĂ„ internet som har ditt projekts URL skicka data till det. Vi kan konstatera att det Ă€r sĂ€llsynt.

Fördelarna

Gitprotokollet Àr ofta det snabbaste tillgÀngliga nÀtverksöverföringsprotokollet. Om du hanterar stora mÀngder trafik för ett publikt projekt eller hanterar vÀldigt stora projekt som inte krÀver autentisering för lÀsÄtkomst Àr det troligt att du vill konfigurera en Git-daemon för att tillgÀngliggöra ditt projekt. Det anvÀnder samma dataöverföringsmekanism som SSH-protokollet men utan overhead för kryptering och autentisering.d.

Nackdelarna

Nersidan av Gitprotokollet Àr avsaknaden av autentisering. Det Àr normalt inte önskvÀrt för Gitprotokoll att vara den enda Ätkomsten för ditt projekt. Man brukar para det med SSH- eller HTTPS-Ätkomst för de fÄ utvecklare som har skrivrÀttigheter och alla andra fÄr anvÀnda git:// för enbart lÀsrÀttigheter. Det Àr ocksÄ förmodligen det svÄraste protokollet att konfigurera. Det mÄste köra sin egen daemon, vilket krÀver konfiguration av xinetd, systemd eller liknande vilket inte alltid Àr en promenad i parken. Det krÀver ocksÄ brandvÀggskonfiguration av port 9418 vilket inte Àr en standardport som företags brandvÀggar alltid tillÄter. Bakom stora företags brandvÀggar Àr denna obskyra port vanligtvis blockerad.

scroll-to-top