Chapters ▾ 2nd Edition

10.8 Git bakom kulisserna - Miljövariabler

Miljövariabler

Git kör alltid i ett bash‑skal och använder ett antal miljövariabler i skalet för att avgöra hur det beter sig. Ibland är det praktiskt att veta vilka dessa är och hur de kan användas för att få Git att bete sig som du vill. Det här är inte en komplett lista över alla miljövariabler Git uppmärksammar, men vi tar upp de mest användbara.

Globalt beteende

En del av Gits allmänna beteende som program styrs av miljövariabler.

GIT_EXEC_PATH avgör var Git letar efter sina underprogram (som git-commit, git-diff och andra). Du kan kontrollera den aktuella inställningen genom att köra git --exec-path.

HOME brukar normalt inte betraktas som justerbar (för många andra saker beror på den), men det är där Git letar efter den globala konfigurationsfilen. Om du vill ha en verkligt portabel Git‑installation med global konfiguration kan du skriva över HOME i den portabla Git‑skalprofilen.

Liknande gäller PREFIX, men för systemomfattande konfiguration. Git letar efter denna fil vid $PREFIX/etc/gitconfig.

GIT_CONFIG_NOSYSTEM inaktiverar, om den är satt, användningen av den systemomfattande konfigurationsfilen. Det är användbart om din systemkonfiguration stör dina kommandon, men du inte har åtkomst att ändra eller ta bort den.

GIT_PAGER styr programmet som används för att visa flersidiga utdata på kommandoraden. Om den är osatt används PAGER som reserv.

GIT_EDITOR är redigeraren som Git startar när användaren behöver redigera text (till exempel ett incheckningsmeddelande). Om den är osatt används EDITOR.

Förvarslägen

Git använder flera miljövariabler för att avgöra hur det interagerar med det aktuella kodförrådet.

GIT_DIR är platsen för .git‑katalogen. Om detta inte anges går Git uppåt i katalogträdet tills det kommer till ~ eller /, och letar efter en .git‑katalog vid varje steg.

GIT_CEILING_DIRECTORIES styr beteendet när Git söker efter en .git‑katalog. Om du öppnar kataloger som är långsamma att läsa in (till exempel på en bandstation eller över en långsam nätverksanslutning) kan du vilja att Git slutar försöka tidigare än det annars skulle, särskilt om Git anropas när ditt skals prompt byggs.

GIT_WORK_TREE är platsen för roten av arbetskatalogen för ett icke‑bart kodförråd. Om --git-dir eller GIT_DIR anges men inget av --work-tree, GIT_WORK_TREE eller core.worktree anges, betraktas den aktuella arbetskatalogen som toppnivån i ditt arbetsträd.

GIT_INDEX_FILE är sökvägen till indexfilen (endast icke‑bara kodförråd).

GIT_OBJECT_DIRECTORY kan användas för att ange platsen för katalogen som vanligtvis ligger på .git/objects.

GIT_ALTERNATE_OBJECT_DIRECTORIES är en kolon‑separerad lista (formaterad som /dir/one:/dir/two:…) som talar om för Git var det ska leta efter objekt om de inte finns i GIT_OBJECT_DIRECTORY. Om du råkar ha många projekt med stora filer som har exakt samma innehåll kan detta användas för att undvika att lagra för många kopior av dem.

Pathspecar

En “pathspec” beskriver hur du anger sökvägar till saker i Git, inklusive användning av jokertecken. Dessa används i .gitignore‑filen, men också på kommandoraden (git add *.c).

GIT_GLOB_PATHSPECS och GIT_NOGLOB_PATHSPECS styr standardbeteendet för jokertecken i pathspecar. Om GIT_GLOB_PATHSPECS är satt till 1 fungerar jokertecken som sådana (vilket är standard); om GIT_NOGLOB_PATHSPECS är satt till 1 matchar jokertecken bara sig själva, vilket betyder att något som *.c bara skulle matcha en fil som heter “\*.c”, i stället för varje fil vars namn slutar på .c. Du kan åsidosätta detta i enskilda fall genom att börja pathspecen med :(glob) eller :(literal), som i :(glob)\*.c.

GIT_LITERAL_PATHSPECS inaktiverar båda ovanstående beteenden; inga jokertecken fungerar, och åsidosättningsprefixen är också inaktiverade.

GIT_ICASE_PATHSPECS gör att alla pathspecar fungerar skiftlägesokänsligt.

Incheckning

Det slutliga skapandet av ett Git‑incheckningsobjekt görs vanligtvis av git-commit-tree, som använder dessa miljövariabler som sin primära informationskälla och bara faller tillbaka på konfigurationsvärden om dessa inte finns.

GIT_AUTHOR_NAME är det mänskligt läsbara namnet i fältet “author”.

GIT_AUTHOR_EMAIL är e‑postadressen för fältet “author”.

GIT_AUTHOR_DATE är tidsstämpeln som används för fältet “author”.

GIT_COMMITTER_NAME anger det mänskliga namnet för fältet “committer”.

GIT_COMMITTER_EMAIL är e‑postadressen för fältet “committer”.

GIT_COMMITTER_DATE används för tidsstämpeln i fältet “committer”.

EMAIL är reserv‑e‑postadressen ifall konfigurationsvärdet user.email inte är satt. Om det inte är satt faller Git tillbaka till systemets användar‑ och värdnamn.

Nätverk

Git använder curl‑biblioteket för nätverksoperationer över HTTP, så GIT_CURL_VERBOSE säger åt Git att skriva ut alla meddelanden som genereras av det biblioteket. Det liknar att köra curl -v på kommandoraden.

GIT_SSL_NO_VERIFY säger åt Git att inte verifiera SSL‑certifikat. Det kan ibland vara nödvändigt om du använder ett självsignerat certifikat för att servera Git‑kodförråd över HTTPS, eller om du håller på att sätta upp en Git‑server men ännu inte har installerat ett fullständigt certifikat.

Om datahastigheten för en HTTP‑operation är lägre än GIT_HTTP_LOW_SPEED_LIMIT byte per sekund under längre tid än GIT_HTTP_LOW_SPEED_TIME sekunder avbryter Git den operationen. Dessa värden åsidosätter konfigurationsvärdena http.lowSpeedLimit och http.lowSpeedTime.

GIT_HTTP_USER_AGENT sätter användaragent‑strängen som Git använder när den kommunicerar över HTTP. Standardvärdet är något i stil med git/2.0.0.

Diffning och sammanslagning

GIT_DIFF_OPTS är ett lite missvisande namn. De enda giltiga värdena är -u<n> eller --unified=<n>, som styr antalet kontextrader som visas i ett git diff‑kommando.

GIT_EXTERNAL_DIFF används som en åsidosättning av konfigurationsvärdet diff.external. Om den är satt kommer Git att anropa detta program när git diff anropas.

GIT_DIFF_PATH_COUNTER och GIT_DIFF_PATH_TOTAL är användbara inifrån programmet som anges av GIT_EXTERNAL_DIFF eller diff.external. Det förstnämnda representerar vilken fil i en serie som diffas (med start på 1), och det senare är det totala antalet filer i omgången.

GIT_MERGE_VERBOSITY styr utdata för den rekursiva sammanslagningsstrategin. Tillåtna värden är följande:

  • 0 skriver inget, förutom möjligtvis ett enda felmeddelande.

  • 1 visar endast konflikter.

  • 2 visar också filändringar.

  • 3 visar när filer hoppas över eftersom de inte har ändrats.

  • 4 visar alla sökvägar när de bearbetas.

  • 5 och högre visar detaljerad felsökningsinformation.

Standardvärdet är 2.

Felsökning

Vill du verkligen veta vad Git håller på med? Git har en ganska komplett uppsättning spårningar inbyggda, och allt du behöver göra är att slå på dem. De möjliga värdena för dessa variabler är följande:

  • “true”, “1” eller “2” – spårningskategorin skrivs till stderr.

  • En absolut sökväg som börjar med / – spårutdata skrivs till den filen.

GIT_TRACE styr allmänna spårningar, som inte passar i någon specifik kategori. Detta inkluderar expansion av alias och delegering till andra underprogram.

$ 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 styr spårning av packfilåtkomst. Det första fältet är packfilen som används, det andra är offseten i den filen:

$ 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 aktiverar paketnivåspårning för nätverksoperationer.

$ 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 styr loggning av prestandadata. Utdata visar hur lång tid varje enskild git‑körning tar.

$ 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 visar information om vad Git upptäcker om kodförrådet och miljön det interagerar med.

$ 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

Övrigt

GIT_SSH, om den är angiven, är ett program som anropas i stället för ssh när Git försöker ansluta till en SSH‑värd. Det anropas som $GIT_SSH [username@]host [-p <port>] <command>. Observera att detta inte är det enklaste sättet att anpassa hur ssh anropas; det stödjer inte extra kommandoradsparametrar. För att stödja extra kommandoradsparametrar kan du använda GIT_SSH_COMMAND, skriva ett omslagsskript och sätta GIT_SSH att peka på det eller använda filen ~/.ssh/config.

GIT_SSH_COMMAND sätter SSH‑kommandot som används när Git försöker ansluta till en SSH‑värd. Kommandot tolkas av skalet, och extra kommandoradsargument kan användas med ssh, som GIT_SSH_COMMAND="ssh -i ~/.ssh/my_key" git clone git\@example.com:my/repo.

GIT_ASKPASS är en åsidosättning av konfigurationsvärdet core.askpass. Det är programmet som anropas när Git behöver be användaren om autentiseringsuppgifter, vilket kan förvänta sig en textfråga som kommandoradsargument och ska returnera svaret på stdout (se Lagring av inloggningsuppgifter för mer om detta delsystem).

GIT_NAMESPACE styr åtkomst till namnrymda refs och är likvärdigt med flaggan --namespace. Det är mest användbart på serversidan, där du kan vilja lagra flera namnrymder för ett enda kodförråd i samma kodförråd och hålla refs separerade.

GIT_FLUSH kan användas för att tvinga Git att använda icke‑buffrad I/O när det skriver inkrementellt till stdout. Ett värde på 1 gör att Git flushar oftare, ett värde på 0 gör att all utdata buffras. Standardvärdet (om variabeln inte är satt) är att välja en lämplig buffringsstrategi beroende på aktivitet och utdataläge.

GIT_REFLOG_ACTION låter dig ange den beskrivande text som skrivs till refloggen. Här är ett exempel:

$ 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