-
1. Kom igÄng
- 1.1 Om versionshantering
- 1.2 En kort historik av Git
- 1.3 Vad Àr Git?
- 1.4 Kommandoraden
- 1.5 Installera Git
- 1.6 AnvÀnda Git för första gÄngen
- 1.7 FÄ hjÀlp
- 1.8 Sammanfattning
-
2. Grunder i Git
- 2.1 Skaffa ett Git-förvar
- 2.2 Spara Àndringar till förvaret
- 2.3 Visa historiken
- 2.4 Ă ngra saker
- 2.5 Jobba med fjÀrrförvar
- 2.6 Taggning
- 2.7 Git alias
- 2.8 Sammanfattning
-
3. Git förgreningar
-
4. Git pÄ servern
- 4.1 Protokollen
- 4.2 Skaffa Git pÄ en server
- 4.3 Generera din publika SSH-nyckel
- 4.4 Konvigurera servern
- 4.5 Git Daemonen
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Alternativ tillhandahÄllna av tredje part
- 4.10 Sammanfattning
-
5. Distribuerade Git
-
6. GitHub
-
7. Git Tools
- 7.1 Revision Selection
- 7.2 Interactive Staging
- 7.3 Stashing and Cleaning
- 7.4 Signing Your Work
- 7.5 Searching
- 7.6 Rewriting History
- 7.7 Reset Demystified
- 7.8 Advanced Merging
- 7.9 Rerere
- 7.10 Debugging with Git
- 7.11 Submodules
- 7.12 Bundling
- 7.13 Replace
- 7.14 Credential Storage
- 7.15 Summary
-
8. Customizing Git
- 8.1 Git Configuration
- 8.2 Git Attributes
- 8.3 Git Hooks
- 8.4 An Example Git-Enforced Policy
- 8.5 Summary
-
9. Git and Other Systems
- 9.1 Git as a Client
- 9.2 Migrating to Git
- 9.3 Summary
-
10. Git Internals
- 10.1 Plumbing and Porcelain
- 10.2 Git Objects
- 10.3 Git References
- 10.4 Packfiles
- 10.5 The Refspec
- 10.6 Transfer Protocols
- 10.7 Maintenance and Data Recovery
- 10.8 Environment Variables
- 10.9 Summary
-
A1. Bilaga A: Git in Other Environments
- A1.1 Graphical Interfaces
- A1.2 Git in Visual Studio
- A1.3 Git in Eclipse
- A1.4 Git in Bash
- A1.5 Git in Zsh
- A1.6 Git in PowerShell
- A1.7 Summary
-
A2. Bilaga B: Embedding Git in your Applications
- A2.1 Command-line Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Bilaga C: Git Commands
- A3.1 Setup and Config
- A3.2 Getting and Creating Projects
- A3.3 Basic Snapshotting
- A3.4 Branching and Merging
- A3.5 Sharing and Updating Projects
- A3.6 Inspection and Comparison
- A3.7 Debugging
- A3.8 Patching
- A3.9 Email
- A3.10 External Systems
- A3.11 Administration
- A3.12 Plumbing Commands
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.