-
1. Aan de slag
- 1.1 Over versiebeheer
- 1.2 Een kort historisch overzicht van Git
- 1.3 Wat is Git?
- 1.4 De commando-regel
- 1.5 Git installeren
- 1.6 Git klaarmaken voor eerste gebruik
- 1.7 Hulp krijgen
- 1.8 Samenvatting
-
2. Git Basics
-
3. Branchen in Git
- 3.1 Branches in vogelvlucht
- 3.2 Eenvoudig branchen en mergen
- 3.3 Branch-beheer
- 3.4 Branch workflows
- 3.5 Branches op afstand (Remote branches)
- 3.6 Rebasen
- 3.7 Samenvatting
-
4. Git op de server
- 4.1 De protocollen
- 4.2 Git op een server krijgen
- 4.3 Je publieke SSH sleutel genereren
- 4.4 De server opzetten
- 4.5 Git Daemon
- 4.6 Slimme HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Hosting oplossingen van derden
- 4.10 Samenvatting
-
5. Gedistribueerd Git
-
6. GitHub
-
7. Git Tools
- 7.1 Revisie Selectie
- 7.2 Interactief stagen
- 7.3 Stashen en opschonen
- 7.4 Je werk tekenen
- 7.5 Zoeken
- 7.6 Geschiedenis herschrijven
- 7.7 Reset ontrafeld
- 7.8 Mergen voor gevorderden
- 7.9 Rerere
- 7.10 Debuggen met Git
- 7.11 Submodules
- 7.12 Bundelen
- 7.13 Vervangen
- 7.14 Het opslaan van inloggegevens
- 7.15 Samenvatting
-
8. Git aanpassen
- 8.1 Git configuratie
- 8.2 Git attributen
- 8.3 Git Hooks
- 8.4 Een voorbeeld van Git-afgedwongen beleid
- 8.5 Samenvatting
-
9. Git en andere systemen
- 9.1 Git als een client
- 9.2 Migreren naar Git
- 9.3 Samenvatting
-
10. Git Binnenwerk
- 10.1 Binnenwerk en koetswerk (plumbing and porcelain)
- 10.2 Git objecten
- 10.3 Git Referenties
- 10.4 Packfiles
- 10.5 De Refspec
- 10.6 Uitwisseling protocollen
- 10.7 Onderhoud en gegevensherstel
- 10.8 Omgevingsvariabelen
- 10.9 Samenvatting
-
A1. Bijlage A: Git in andere omgevingen
- A1.1 Grafische interfaces
- A1.2 Git in Visual Studio
- A1.3 Git in Visual Studio Code
- A1.4 Git in Eclipse
- A1.5 Git in Sublime Text
- A1.6 Git in Bash
- A1.7 Git in Zsh
- A1.8 Git in PowerShell
- A1.9 Samenvatting
-
A2. Bijlage B: Git in je applicaties inbouwen
- A2.1 Commando-regel Git
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Bijlage C: Git Commando’s
- A3.1 Setup en configuratie
- A3.2 Projecten ophalen en maken
- A3.3 Basic Snapshotten
- A3.4 Branchen en mergen
- A3.5 Projecten delen en bijwerken
- A3.6 Inspectie en vergelijking
- A3.7 Debuggen
- A3.8 Patchen
- A3.9 Email
- A3.10 Externe systemen
- A3.11 Beheer
- A3.12 Binnenwerk commando’s (plumbing commando’s)
10.8 Git Binnenwerk - Omgevingsvariabelen
Omgevingsvariabelen
Git draait altijd in een bash
shell, en gebruikt een aantal shell omgevingsvariabelen om te bepalen hoe het zich moet gedragen.
Af en toe is het handig om te weten welke deze zijn, en hoe ze kunnen worden gebruikt om Git zich te laten gedragen op de manier zoals jij dat wilt.
Dit is geen uitputtende lijst van alle omgevingsvariabelen waar Git naar kijkt, maar we zullen de meest nuttige behandelen.
Globaal gedrag
Een bepaald deel van het algemene gedrag van Git als computer programma is afhankelijk van omgevingsvariabelen.
GIT_EXEC_PATH
bepaalt waar Git zijn sub-programma’s zoekt (zoals git-commit
, git-diff
en andere).
Je kunt de huidige waarde zien door git --exec-path
aan te roepen.
HOME
wordt over het algemeen niet beschouwd als aanpasbaar (te veel andere zaken zijn hiervan afhankelijk), maar dit is waar Git op zoek gaat naar het globale configuratie bestand.
Als je een echte overdraagbare Git installatie wilt, compleet met globale configuratie, kan je HOME
overschrijven in het shell profiel van de draagbare Git.
PREFIX
is hiermee vergelijkbaar, maar voor de systeem-brede configuratie.
Git kijkt naar dit bestand op $PREFIX/etc/gitconfig
.
GIT_CONFIG_NOSYSTEM
, indien gezet, schakelt dit het gebruik van het systeem-brede configuratie bestand uit.
Dit kan nuttig zijn als je systeem configuratie je commando’s in de weg zit, maar je hebt hier geen toegang toe om het te wijzigen of te verwijderen.
GIT_PAGER
bepaalt welk programma er gebruikt wordt om uitvoer van meerdere pagina’s op de commando regel te laten zien.
Als deze waarde niet gezet is, wordt PAGER
gebruikt als achtervang.
GIT_EDITOR
is de editor die Git zal aanroepen als de gebruiker tekst moet wijzigen (een commit bericht, bijvoorbeeld).
Als deze waarde niet is gezet, wordt EDITOR
gebruikt.
Locaties van de repository
Git gebruikt een aantal omgevingsvariabelen om te bepalen hoe het met de huidige repository samenwerkt.
GIT_DIR
is de locatie van de .git
folder.
Als dit niet is opgegeven, loopt Git de directory structuur omhoog tot het op ~
of / uitkomt, bij elke stap opzoek naar een .git
directory.
GIT_CEILING_DIRECTORIES
bepaalt het gedrag bij het zoeken naar een .git
directory.
Als je directories in gaat die langzaam zijn (zoals die op een tape drive, of over een langzame netwerkverbinding), zou je ervoor kunnen kiezen om Git te eerder laten stoppen met proberen dan het anders zou doen, zeker als Git wordt aangeroepen als je shell prompt wordt opgebouwd.
GIT_WORK_TREE
is de locatie van de root van de werkdirectory voor een non-bare repository.
Als --git-dir
of GIT-DIR
wordt gespecificeerd maar geen van --work-tree
, GIT_WORK_TREE
of core.worktree
is gegeven wordt de huidige werk-directory beschouwd als het hoogste niveau van je werk-tree.
GIT_INDEX_FILE
is het pad naar het index bestand (alleen bij non-bare repositories).
GIT_OBJECT_DIRECTORY
kan worden gebruikt om de locatie van de directory aan te geven die normaalgesproken onder .git/objects
te vinden is.
GIT_ALTERNATE_OBJECT_DIRECTORIES
is een met dubbele punt gescheiden lijst (geformatteerd als /dir/een:/dir/twee:…
) die vertelt waar Git moet zoeken naar objecten als ze niet in GIT_OBJECT_DIRECTORY
te vinden zijn.
Als je toevallig veel projecten hebt met grote bestanden die precies dezelfde inhoud hebben, kan dit worden gebruiktom te voorkomen dat er teveel kopieën hiervan worden opgeslagen.
Pathspecs
Een “pathspec” refereert aan hoe je paden opgeeft bij zaken in Git, inclusief het gebruik van wildcards.
Deze worden gebruikt in het .gitignore
bestand, maar ook op de commando-regel (git add *.c
).
GIT_GLOB_PATHSPECS
en GIT_NOGLOB_PATHSPECS
bepalen het standaard gedrag van wildcards in pathspecs.
Als GIT_GLOB_PATHSPECS
de waarde 1 heeft, gedragen wildcard karakters als wildcards (wat het standaard gedrag is); als GIT_NOGLOB_PATHSPECS
de waarde 1 heeft, passen wildcard karakters alleen op zichzelf, wat inhoudt dat iets als *c
alleen een bestand met de naam “*.c” zou passen, in plaats van elk bestand waarvan de naam eindigt op .c
.
Je kunt dit gedrag in specifieke gevallen overschrijven door de pathspecs te laten beginnen met :(glob)
of :(literal)
, als in :(glob)*.c
.
GIT_LITERAL_PATHSPECS
schakelt beide bovenstaande gedragingen uit; geen enkele wildcard karakter zal werken, en de overschrijvende prefixes worden ook uitgeschakeld.
GIT_ICASE_PATHSPECS
zet alle pathspecs in voor ongevoelige werkwijze voor hoofdletters en kleine letters.
Committen
De uiteindelijke aanmaak van een Git commit object wordt normaalgesproken gedaan door git-commit-tree
, die de omgevingsvariabelen gebruikt als zijn primaire bron van informatie, waarbij wordt teruggevallen op configuratiewaarden alleen als deze niet aanwezig zijn.
GIT_AUTHOR_NAME
is de mens-leesbare naam in het “author” veld.
GIT_AUTHOR_EMAIL
is de email voor het “author” veld.
GIT_AUTHOR_DATE
is de datum/tijd waarde die voor het “author” veld wordt gebruikt.
GIT_COMMITTER_NAME
bepaalt de mens-leesbare naam voor het “committer” veld.
GIT_COMMITTER_EMAIL
is het email adres voor het “committer” veld.
GIT_COMMITTER_DATE
wordt gebruikt voor de datum/tijd waarde in het “committer” veld.
EMAIL
is de terugvalwaarde voor het email adres in geval de configuratie waarde in user.email
niet is ingevuld.
Als deze niet is ingevuld, valt Git terug op de systeemgebruiker en host naam.
Network communicatie
Git gebruikt de curl
library om netwerk operaties over HTTP te doen, dus GIT_CURL_VERBOSE
vertelt Git om alle berichten uit te sturen die worden gegenereerd door deze library.
Dit is gelijk aan het intypen van curl -v
op de commandoregel.
GIT_SSL_NO_VERIFY
vertelt Git om de SSL certificaten niet te controleren.
Dit kan soms nodig zijn als je een door jezelf ondertekende certificaat gebruikt om Git repositories te bedienen via HTTPS, of je bent bezig met het opzetten van een Git server maar je hebt nog geen volwaardig certificaat geïnstalleerd.
Als de gegevenssnelheid van een HTTP operatie lager is dan GIT_HTTP_LOW_SPEED_LIMIT
bytes per seconde voor langer dan GIT_HTTP_LOW_SPEED_TIME
seconden, zal Git die operatie afbreken.
Deze waarden overschrijven de http.lowSpeedLimit
en http.lowSpeedTime
configuratie waarden.
GIT_HTTP_USER_AGENT
zet de user-agent tekenreeks die Git gebruikt wanneer het communiceert via HTTP.
De standaard waarde is iets als git/2.0.0
.
Diffen en Mergen
GIT_DIFF_OPTS
is een beetje een misnomer.
De enige geldige waarden zijn -u<n>
of --unified=<n>
, wat het aantal contextregels bepaalt die worden getoond met een git diff
commando.
GIT_EXTERNAL_DIFF
wordt gebruikt als een overschrijving voor de diff.external
configuratie waarde.
Als het een waarde heeft, zal Git dit programma gebruiken als git diff
wordt aangeroepen.
GIT_DIFF_PATH_COUNTER
en GIT_DIFF_PATH_TOTAL
zijn nuttig binnen het programma die wordt gespecificeerd door GIT_EXTERNAL_DIFF
of diff.external
.
Het eerste geeft aan welk bestand in een reeks van bestanden wordt gedifft (beginnend met 1), en de laatste is het totaal aantal bestanden in de reeks.
GIT_MERGE_VERBOSITY
bepaalt de uitvoer voor de recursieve merge strategie.
De toegestane waarden zijn als volgt:
-
0 voert niets uit, behalve mogelijk een enkele foutboodschap.
-
1 laat alleen conflicten zien.
-
2 laat ook bestandswijzigingen zien.
-
3 geeft uitvoer als bestanden worden overgeslagen omdat ze niet zijn gewijzigd.
-
4 laat alle paden zien als ze worden verwerkt.
-
5 en hoger laten gedetailleerd debug informatie zien.
De standaardwaarde is 2.
Debuggen
Wil je echt zien waar Git zoal mee bezig is? Git heeft een redelijk volledige set van traces ingebouwd, en alles wat je hoeft te doen is ze aan te zetten. De mogelijke waarden van deze variabelen zijn als volgt:
-
“true”, “1”, of “2” - de trace categorie wordt naar stderr geschreven.
-
Een absoluut pad beginnend met
/
- de trace uitvoer wordt naar dat bestand geschreven.
GIT_TRACE
bepaalt traces over het algemeen die niet in een andere specifieke categorie valt.
Dit is inclusief de expansie van aliassen, en het delegeren naar andere sub-programma’s.
$ GIT_TRACE=true git lga
20:12:49.877982 git.c:554 trace: exec: 'git-lga'
20:12:49.878369 run-command.c:341 trace: run_command: 'git-lga'
20:12:49.879529 git.c:282 trace: alias expansion: lga => 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.879885 git.c:349 trace: built-in: git 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.899217 run-command.c:341 trace: run_command: 'less'
20:12:49.899675 run-command.c:192 trace: exec: 'less'
GIT_TRACE_PACK_ACCESS
bepaalt het traceren van packfile toegang.
Het eerste veld is de packfile die wordt benaderd, het tweede is de relatieve afstand (offset) binnen dat bestand:
$ GIT_TRACE_PACK_ACCESS=true git status
20:10:12.081397 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 12
20:10:12.081886 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 34662
20:10:12.082115 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 35175
# […]
20:10:12.087398 sha1_file.c:2088 .git/objects/pack/pack-e80e...e3d2.pack 56914983
20:10:12.087419 sha1_file.c:2088 .git/objects/pack/pack-e80e...e3d2.pack 14303666
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
GIT_TRACE_PACKET
zet traceren op pakket-niveau voor netwerk operaties aan.
$ GIT_TRACE_PACKET=true git ls-remote origin
20:15:14.867043 pkt-line.c:46 packet: git< # service=git-upload-pack
20:15:14.867071 pkt-line.c:46 packet: git< 0000
20:15:14.867079 pkt-line.c:46 packet: git< 97b8860c071898d9e162678ea1035a8ced2f8b1f HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed no-done symref=HEAD:refs/heads/master agent=git/2.0.4
20:15:14.867088 pkt-line.c:46 packet: git< 0f20ae29889d61f2e93ae00fd34f1cdb53285702 refs/heads/ab/add-interactive-show-diff-func-name
20:15:14.867094 pkt-line.c:46 packet: git< 36dc827bc9d17f80ed4f326de21247a5d1341fbc refs/heads/ah/doc-gitk-config
# […]
GIT_TRACE_PERFORMANCE
bepaalt het loggen van performance gegevens aan.
De uitvoer laat zien hoe lang elk specifieke git aanroep duurt.
$ GIT_TRACE_PERFORMANCE=true git gc
20:18:19.499676 trace.c:414 performance: 0.374835000 s: git command: 'git' 'pack-refs' '--all' '--prune'
20:18:19.845585 trace.c:414 performance: 0.343020000 s: git command: 'git' 'reflog' 'expire' '--all'
Counting objects: 170994, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (43413/43413), done.
Writing objects: 100% (170994/170994), done.
Total 170994 (delta 126176), reused 170524 (delta 125706)
20:18:23.567927 trace.c:414 performance: 3.715349000 s: git command: 'git' 'pack-objects' '--keep-true-parents' '--honor-pack-keep' '--non-empty' '--all' '--reflog' '--unpack-unreachable=2.weeks.ago' '--local' '--delta-base-offset' '.git/objects/pack/.tmp-49190-pack'
20:18:23.584728 trace.c:414 performance: 0.000910000 s: git command: 'git' 'prune-packed'
20:18:23.605218 trace.c:414 performance: 0.017972000 s: git command: 'git' 'update-server-info'
20:18:23.606342 trace.c:414 performance: 3.756312000 s: git command: 'git' 'repack' '-d' '-l' '-A' '--unpack-unreachable=2.weeks.ago'
Checking connectivity: 170994, done.
20:18:25.225424 trace.c:414 performance: 1.616423000 s: git command: 'git' 'prune' '--expire' '2.weeks.ago'
20:18:25.232403 trace.c:414 performance: 0.001051000 s: git command: 'git' 'rerere' 'gc'
20:18:25.233159 trace.c:414 performance: 6.112217000 s: git command: 'git' 'gc'
GIT_TRACE_SETUP
laat informatie zien over wat Git ontdekt over de repository en de omgeving waar het mee samenwerkt.
$ GIT_TRACE_SETUP=true git status
20:19:47.086765 trace.c:315 setup: git_dir: .git
20:19:47.087184 trace.c:316 setup: worktree: /Users/ben/src/git
20:19:47.087191 trace.c:317 setup: cwd: /Users/ben/src/git
20:19:47.087194 trace.c:318 setup: prefix: (null)
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
Diversen
GIT_SSH
, indien meegegeven, is een programma dat wordt aangeroepen inplaats van ssh
als Git probeert verbinding te leggen naar een SSH host.
Het wordt aangeroepen als $GIT_SSH [gebruikersnaam@]host [-p <poort>] <commando>
.
Merk op dat dit niet de makkelijkste manier is om de manier waarop ssh
wordt aangeroepen aan te passen; het zal extra commando-regel parameters niet ondersteunen, dus je zult een wrapper script moeten schrijven en GIT_SSH
hiernaar moeten laten wijzen.
Het is waarschijnlijk makkelijker om gewoon het ~/.ssh/config
bestand hiervoor te gebruiken.
GIT_ASKPASS
overschrijft de waarde van de core.askpass
configuratie waarde.
Dit is het programma dat wordt aangeroepen elke keer als Git de gebruiker moet vragen om de aanloggegevens, die een tekst prompt mag verwachten als een commando-regel argument, en het antwoord moet teruggeven op stdout
.
(Zie Het opslaan van inloggegevens voor meer over dit subsysteem.)
GIT_NAMESPACE
bepaalt de toegang tot refs in een namespace, en is gelijjkwaardig aan de --namespace
vlag.
Dit wordt is voornamelijk nuttig aan de kant van de server, waar je misschien meerdere forks wilt opslaan van een enkele repository, waarbij alleen de refs apart wordt gehouden.
GIT_FLUSH
kan gebruikt worden om Git te dwingen om niet gebufferde I/O te gebruiken als het incrementeel naar stdout schrijft.
Een waarde van 1 heeft als gevolg dat Git vaker wegschrijft, een waarde van 0 heeft tot gevolg dat alle uitvoer eerst wordt gebufferd.
De standaard waarde (als deze waarde niet wordt opgegeven) is om een toepasselijke bufferschema te kiezen afhankelijk van de aktiviteit en de uitvoer-modus.
GIT_REFLOG_ACTION
* laat je de omschrijvende tekst bepalen die naar de reflog wordt geschreven.
Hier is een voorbeeld:
$ GIT_REFLOG_ACTION="my action" git commit --allow-empty -m 'my message'
[master 9e3d55a] my message
$ git reflog -1
9e3d55a HEAD@{0}: my action: my message