Git 🌙
Chapters ▾ 2nd Edition

10.8 Notranjost Gita - Spremenljivke okolja

Spremenljivke okolja

Git vedno deluje znotraj lupine bash in uporablja več lupinskih okoljskih spremenljivk, da določi, kako se obnaša. Občasno je koristno vedeti, kaj so te spremenljivke in kako jih lahko uporabimo, da Git deluje tako, kot želimo. To ni izčrpen seznam vseh okoljskih spremenljivk, na katere Git obrača pozornost, vendar bomo obravnavali najbolj uporabne.

Globalno obnašanje

Nekatere splošne lastnosti Gitovega obnašanja kot računalniškega programa so odvisne od okoljskih spremenljivk.

GIT_EXEC_PATH določa, kje Git išče svoje podprograme (kot so git-commit, git-diff in drugi). Trenutne nastavitve lahko preverite z zagonom git --exec-path.

HOME se običajno ne šteje za prilagodljivega (preveč drugih stvari je odvisnih od njega), vendar je to mesto, kjer Git išče globalno konfiguracijsko datoteko. Če želite resnično prenosno namestitev Git, skupaj z globalno konfiguracijo, lahko v profilu lupine prenosnega Gita preglasite HOME.

PREFIX je podoben, vendar namenjen konfiguraciji v celotnem sistemu. Git išče to datoteko na $PREFIX/etc/gitconfig.

GIT_CONFIG_NOSYSTEM, če je nastavljen, onemogoči uporabo konfiguracijske datoteke v celotnem sistemu. To je uporabno, če vaša sistemska konfiguracija moti vaše ukaze, vendar nimate dostopa do njene spremembe ali odstranitve.

GIT_PAGER nadzoruje program, ki se uporablja za prikaz večstranskega izhoda v ukazni vrstici. Če tega ni, se bo PAGER uporabljal kot nadomestitev.

GIT_EDITOR je urejevalnik, ki ga bo Git zagnal, ko bo uporabnik moral urejati nekaj besedila (na primer sporočilo potrditve). Če ni nastavljen, bo uporabljen EDITOR.

Lokacije repozitorijev

Git uporablja več okoljskih spremenljivk za določanje vmesnika s trenutnim repozitorijem.

GIT_DIR je mesto direktorija .git. Če ta ni določen, Git hodi po drevesu direktorija navzgor, dokler ne pride do ~ ali / in pri vsakem koraku išče direktorij .git.

GIT_CEILING_DIRECTORIES nadzoruje obnašanje iskanja direktorija .git. Če dostopate do direktorijev, ki se počasi nalagajo (na primer tisti na pogonu traku ali preko počasnega omrežnega priključka), želite, da se Git preneha truditi prej, kot bi sicer, še posebej, če je Git sprožen pri izgradnji vaše lupine.

GIT_WORK_TREE je mesto korenskega direktorija delovnega direktorija za ne-goli repozitorij. Če je določen --git-dir ali GIT_DIR, vendar ni določena nobena od --work-tree, GIT_WORK_TREE ali core.worktree, se trenutni delovni direktorij obravnava kot vrh vašega delovnega drevesa.

GIT_INDEX_FILE je pot do datoteke indeksa (samo za ne-gole repozitorije).

GIT_OBJECT_DIRECTORY se lahko uporabi za določitev mesta direktorija, ki običajno prebiva v .git/objects.

GIT_ALTERNATE_OBJECT_DIRECTORIES je seznam ločen z dvopičjem (oblikovan kot /dir/one:/dir/two:…), ki pove Gitu, kje preveriti objekte, če jih ni v GIT_OBJECT_DIRECTORY. Če imate veliko projektov z velikimi datotekami, ki imajo natančno enako vsebino, lahko to uporabite za izogibanje shranjevanju preveč kopij.

Pathspec-i

»Pathspec« se nanaša na način, kako v Gitu določate poti do stvari, vključno z uporabo nadomestnih znakov. Ti se uporabljajo v datoteki .gitignore pa tudi v ukazni vrstici (git add *.c).

GIT_GLOB_PATHSPECS in GIT_NOGLOB_PATHSPECS nadzirata privzeto obnašanje posebnih znakov v pathspec-ih. Če je GIT_GLOB_PATHSPECS nastavljen na 1, nadomestni znaki delujejo kot maskirni znaki (kar je privzeto); če je GIT_NOGLOB_PATHSPECS nastavljen na 1, nadomestni znaki ustrezajo le sami sebi, kar pomeni, da bi se nekaj, kot je *.c, ujelo le z datoteko poimenovano »\*.c«, ne pa z vsako datoteko, katere ime se konča s .c. To lahko v posameznih primerih preglasite tako, da začnete pathspec z :(glob) ali :(literal), kot je na primer :(glob)\*.c.

GIT_LITERAL_PATHSPECS onemogoči obe zgoraj opisani obnašanji; nadomestni znaki ne bodo delovali in preglasitvene predpone bodo tudi onemogočene.

GIT_ICASE_PATHSPECS nastavi vse pathspec-e, da delujejo v načinu brez razlikovanja velikosti črk.

Potrjevanje

Končno ustvarjanje objekta potrditve Git je običajno opravljena z git-commit-tree, ki uporablja te okoljske spremenljivke kot svoj primarni vir informacij in se zanaša na vrednosti konfiguracije le, če teh spremenljivk ni prisotnih.

GIT_AUTHOR_NAME je čitljivo ime v polju »avtor«.

GIT_AUTHOR_EMAIL je e-poštni naslov za polje »avtor«.

GIT_AUTHOR_DATE je časovni žig, uporabljen za polje »avtor«.

GIT_COMMITTER_NAME nastavi ime za polje »potrjevalec«.

GIT_COMMITTER_EMAIL je e-poštni naslov za polje »potrjevalec«.

GIT_COMMITTER_DATE se uporablja za časovni žig v polju »potrjevalec«.

EMAIL je nadomestni e-poštni naslov, če konfiguracijska vrednost user.email ni nastavljena. Če ta ni nastavljena, se Git zanaša na sistemsko uporabniško ime in imena gostiteljev sistema.

Omrežje

Git uporablja knjižnico curl za mrežne operacije prek HTTP-ja, zato GIT_CURL_VERBOSE Gitu sporoča, da izpiše vsa sporočila, ki jih ustvari ta knjižnica. To je podobno, kot če bi v ukazni vrstici uporabili curl -v.

GIT_SSL_NO_VERIFY Gitu sporoči, naj ne preverja certifikatov SSL. To je včasih potrebno, če uporabljate samo-podpisani certifikat za streženje repozitorijev Git prek HTTPS-ja, ali pa če postavljate strežnik Git in še niste namestili celotnega certifikata.

Če je hitrost prenosa podatkov operacije HTTP nižja od GIT_HTTP_LOW_SPEED_LIMIT bajtov na sekundo več kot GIT_HTTP_LOW_SPEED_TIME sekund, bo Git prekinil to operacijo. Te vrednosti preglasijo konfiguracijski vrednosti http.lowSpeedLimit in http.lowSpeedTime.

GIT_HTTP_USER_AGENT nastavi niz uporabniškega agenta, ki ga Git uporablja za komunikacijo prek HTTP-ja. Privzeta vrednost je vrednost, kot je git/2.0.0.

Prikazovanje razlik in združevanje

GIT_DIFF_OPTS je nekoliko napačno poimenovan. Edine veljavne vrednosti so -u<n> ali --unified=<n>, kar nadzira število vrstic konteksta, ki jih prikaže ukaz git diff.

GIT_EXTERNAL_DIFF se uporablja kot preglasitev konfiguracijske vrednosti diff.external. Če je nastavljena, bo Git ta program sprožil ob klicu ukaza git diff.

GIT_DIFF_PATH_COUNTER in GIT_DIFF_PATH_TOTAL sta uporabni znotraj programa, določenega z GIT_EXTERNAL_DIFF ali diff.external. Prva predstavlja, katera datoteka v seriji je v procesu primerjave razlik (začenši z 1), druga pa je skupno število datotek v paketu.

GIT_MERGE_VERBOSITY nadzira izhodno vrednost za rekurzivno strategijo združevanja. Dovoljene vrednosti so:

  • 0 ne izpiše ničesar, razen morda enega samega sporočila o napaki.

  • 1 prikaže samo konflikte.

  • 2 prikaže tudi spremembe v datotekah.

  • 3 prikaže, ko so datoteke izpuščene, ker se niso spremenile.

  • 4 prikazuje vse poti, kot se obdelujejo.

  • 5 in več prikazuje podrobne informacije za odpravljanje težav.

Privzeta vrednost je 2.

Razhroščevanje

Želite resnično vedeti, kaj počne Git? Git ima vgrajen skoraj popoln nabor sledi in vse, kar morate storiti, je, da jih vklopite. Možne vrednosti teh spremenljivk so naslednje:

  • true, 1, ali 2 — sled kategorije se izpiše v stderr.

  • Absolutna pot, ki se začne s / — sled se izpiše v datoteko na tej poti.

GIT_TRACE nadzoruje splošne sledi, ki se ne ujemajo s katero koli posebno kategorijo. To vključuje razširitev aliasov in delegacijo drugim podprogramom.

$ 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 nadzoruje sledenje dostopu do paketnih datotek. Prvo polje predstavlja paketno datoteko, do katere se dostopa, drugo polje pa je odmik znotraj te datoteke:

$ 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 omogoča sledenje na ravni paketov za omrežne operacije.

$ 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 nadzira beleženje podatkov o uspešnosti. Izpis prikazuje, koliko časa traja posamezni klic git.

$ 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 prikazuje informacije o tem, kaj Git odkriva o repozitoriju in okolju, s katerim sodeluje.

$ 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

Razno

GIT_SSH, če je določen, je program, ki se sproži namesto ssh, ko Git poskuša vzpostaviti povezavo z gostiteljem SSH. Sproži se kot $GIT_SSH [uporabnik@]gostitelj [-p <vrata>] <ukaz>. Upoštevajte, da to ni najlažji način prilagajanja načina, kako se sproži ssh; ne podpira dodatnih parametrov ukazne vrstice, zato bi morali napisati ovijalni skript in nastaviti GIT_SSH, da kaže nanj. Za to je verjetno lažje uporabiti datoteko ~/.ssh/config. Vedite, da to ni najlažji način za prilagoditev, kako je ssh priklican; to ne bo podpiralo dodatnih parametrov ukazne vrstice. Za podporo dodatnih parametrov ukazne vrstice lahko uporabite GIT_SSH_COMMAND, napišete ovojni skript in nastavite GIT_SSH, da kaže nanj, ali pa uporabite datoteko ~/.ssh/config.

GIT_SSH_COMMAND nastavi ukaz SSH, ki je uporabljen, ko se Git poskuša povezati z gostiteljem SSH. Ukaz interpretira lupina in dodatni argumenti ukazne vrstice se lahko uporabijo pri ssh, kot je GIT_SSH_COMMAND="ssh -i ~/.ssh/my_key" git clone git@example.com:my/repo.

GIT_ASKPASS je nadomestitev za konfiguracijsko vrednost core.askpass. To je program, ki se sproži vsakič, ko Git potrebuje uporabniške poverilnice in pričakuje besedilni poziv kot argument ukazne vrstice, odgovor pa vrne na stdout (glejte razdelek Shramba poverilnic za več informacij o tem podsistemu).

GIT_NAMESPACE nadzira dostop do referenc imenskega prostora in je enakovreden zastavici --namespace. To je večinoma uporabno na strežniški strani, kjer želite shranjevati več različic ene same zbirke v eni zbirki in ohraniti reference ločene.

GIT_FLUSH lahko uporabite za prisilitev Gita, da uporablja I/O brez medpomnilnika pri postopnem pisanju na stdout. Vrednost 1 povzroči, da Git bolj pogosto izprazni, vrednost 0 pa povzroči, da je ves izhod v medpomnilniku. Privzeta vrednost (če ta spremenljivka ni nastavljena) je izbira ustrezne sheme medpomnilnika glede na dejavnost in način izhoda.

GIT_REFLOG_ACTION vam omogoča, da določite opisni besedilni zapis, zapisan v referenčnem dnevniku (reflog). Tukaj je primer:

$ 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