Git 🌙
Chapters ▾ 2nd Edition

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
scroll-to-top