Git 🌙
Chapters ▾ 2nd Edition

8.8 Git на ниско ниво - Environment променливи

Environment променливи

Git работи в bash шел и използва множество environment променливи за да регулира поведението си. Понякога е добре да знаем кои са те и как могат да се използват за фина настройка на Git. Това не е пълен списък с всички използвани променливи, но ще прегледаме най-полезните от тях.

Глобално поведение

Някои от аспектите от работата на Git като компютърна програма зависят от environment променливите.

GIT_EXEC_PATH определя къде Git търси своите подпрограми (като git-commit, git-diff, и т.н.). Може да проверите текущата стойност с git --exec-path.

HOME нормално не се третира като настройваема променлива (защото твърде много други неща зависят от нейната стойност), от нея се определя къде Git търси глобалния си конфигурационен файл. Ако искате изцяло portable Git инсталация, завършена с глобални конфигурации, може да презапишете HOME в portable shell профила на Git.

PREFIX е подобна, но се използва за system-wide конфигурации. Git търси този файл в $PREFIX/etc/gitconfig.

GIT_CONFIG_NOSYSTEM, ако е зададена, забранява използването на system-wide конфигурационния файл. Това е полезно, ако системната конфигурация е в конфликт с командите ви, но нямате достъп до нея.

GIT_PAGER контролира програмата, която се използва за показване на дълъг изход в командния ред. Ако не е зададена, ще се използва стойността от PAGER.

GIT_EDITOR задава редактора, който Git ще стартира при нужда от редакция на текст (например за къмит съобщение). Ако не е зададена, използва се посоченото в EDITOR променливата.

Локации в хранилища

Git използва няколко environment променливи за да определи как да оперира с текущото хранилище.

GIT_DIR е пътя за директорията .git. Ако не е указан, Git се качва по дървото с директориите докато стигне до ~ или / търсейки за .git на всяка стъпка.

GIT_CEILING_DIRECTORIES контролира маниера на търсене за .git директория. Ако посещавате директории, достъпа до които е бавен (например такива на лентово устройство или през бавна мрежова връзка), може да искате да инструктирате Git да спре да опитва по-рано отколкото би могъл.

GIT_WORK_TREE е root локацията на работната директория за non-bare хранилище. Ако са указани --git-dir или GIT_DIR, но нито едно от --work-tree, GIT_WORK_TREE и core.worktree, тогава за текуща работна директория се счита най-горното ниво на работното ви дърво.

GIT_INDEX_FILE е пътя до индексния файл (само за non-bare хранилища).

GIT_OBJECT_DIRECTORY може да се използва за задаване на мястото на директорията, която нормално е .git/objects.

GIT_ALTERNATE_OBJECT_DIRECTORIES е разделен с двуеточия списък (форматиран като /dir/one:/dir/two:…), който казва на Git къде да проверява за обекти, които не са в локацията от GIT_OBJECT_DIRECTORY. Ако се случи да имате много проекти с идентични големи файлове, това може да се използва като начин да избегнете съхранението на твърде много на брой техни копия.

Pathspecs

Терминът “pathspec” се отнася до това как указвате пътища до неща в Git, включително използването на wildcards. Такива се използват в .gitignore файла, но също и в командния ред (git add \*.c).

GIT_GLOB_PATHSPECS и GIT_NOGLOB_PATHSPECS контролират поведението по подразбиране на wildcard символите в pathspecs. Ако GIT_GLOB_PATHSPECS е със стойност 1, wildcard символите работят като wildcards (така е по подразбиране); Ако GIT_NOGLOB_PATHSPECS е 1, тогава wildcard символите само съвпадат със самите тях, което значи, че *.c ще намери само файл с име “\*.c”, вместо всеки файл с окончание .c. Можете да променяте това в индивидуални случаи започвайки дадения pathspec с :(glob) или :(literal), както например :(glob)\*.c.

GIT_LITERAL_PATHSPECS забранява и двете горни поведения и никакви wildcard символи няма да работят, override префиксите също се забраняват.

GIT_ICASE_PATHSPECS указва всички pathspecs да работят в case-insensitive маниер.

Къмитване

Финалното създаване на Git къмит обект обикновено се прави с git-commit-tree, която използва тези environment променливи като основен източник на информация, използвайки конфигурационните стойности като резервен вариант, ако те не съществуват:

GIT_AUTHOR_NAME е human-readable име за полето “author”.

GIT_AUTHOR_EMAIL е имейл адреса за “author”.

GIT_AUTHOR_DATE е timestamp за “author” полето.

GIT_COMMITTER_NAME задава human име за полето “committer”.

GIT_COMMITTER_EMAIL е имейл адреса за “committer”.

GIT_COMMITTER_DATE е timestamp за “committer” полето.

EMAIL се използва като резервен имейл адрес, ако нямаме стойност за конфигурацията user.email. Ако и тази променлива не е зададена, Git използва системните user и host имена.

Мрежови функции

Git използва библиотеката curl за мрежови активности през HTTP. Променливата GIT_CURL_VERBOSE указва на Git да печата всички съобщения, генерирани от библиотеката. Това е подобно на curl -v в командния ред.

GIT_SSL_NO_VERIFY казва на Git да не проверява SSL сертификати. Това понякога е необходимо, ако използвате self-signed сертификати за да обслужвате Git хранилища през HTTPS или ако изграждате Git сървър, но все още не сте инсталирали валиден сертификат.

Ако скоростта на HTTP операция е по-ниска от указаните в GIT_HTTP_LOW_SPEED_LIMIT байта в секунда за повече от GIT_HTTP_LOW_SPEED_TIME секунди, Git ще откаже тази операция. Тези стойности са с приоритет пред http.lowSpeedLimit и http.lowSpeedTime конфигурационните настройки.

GIT_HTTP_USER_AGENT определя user-agent стринга, който Git използва при комуникация през HTTP. По подразбиране се използва нещо като git/2.0.0.

Diffing и Merging

GIT_DIFF_OPTS е леко заблуждаващо наименование. Единствено валидните стойности са -u<n> или --unified=<n>, което определя броя на context редовете показвани от команда git diff.

GIT_EXTERNAL_DIFF се използва за приоритет пред конфигурационната стойност diff.external. Ако е зададена, Git ще стартира съответната програма при изпълнение на git diff.

GIT_DIFF_PATH_COUNTER и GIT_DIFF_PATH_TOTAL са полезни за използване в програмата указана от GIT_EXTERNAL_DIFF или diff.external. Първата указва върху кой файл от серия такива ще се изпълни diff (започвайки с 1), а втората задава общия брой файлове за всяка batch операция.

GIT_MERGE_VERBOSITY контролира изхода за recursive merge стратегия. Позволените стойности са:

  • 0 не извежда нищо с изключение на евентуално единично съобщение за грешка.

  • 1 показва само конфликти.

  • 2 също показва и файлови промени.

  • 3 показва, когато файлове се пропускат, защото не са променени.

  • 4 показва всички пътища по време на обработка.

  • 5 и нагоре, показва детайлна debugging информация.

По подразбиране стойността е 2.

Дебъгване

Искате наистина да знаете с какво се занимава Git? Git има сравнително завършен набор от вградени traces и просто трябва да ги включите. Възможните стойност за тези променливи са както следва:

  • “true”, “1”, или “2” — trace категорията се изпраща към stderr.

  • Абсолютен път започващ с / — trace изходът ще се записва в този файл.

GIT_TRACE управлява общи traces, които не попадат в нито една специфична категория. Това включва разширяването на aliases, и делегиране към други подпрограми.

$ 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 контролира трасирането на packfile достъп. Първото поле е съответния packfile, второто е отстъпа в него:

$ 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 позволява packet-level tracing за мрежови операции.

$ 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 контролира записа на данните за производителността. Изходът показва колко време е отнела всяка отделна 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 показва информация за това какво знае Git за хранилището и обкръжението, с които комуникира.

$ 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

Други променливи

GIT_SSH, ако е указана, е програмата, която ще се използва вместо ssh, когато Git опитва да комуникира с SSH хост. Тя се извиква така: $GIT_SSH [username@]host [-p <port>] <command>. Това не е най-лесният начин да се промени настройката за повикване на ssh и няма да поддържа допълнителни параметри за командния ред, така че може би ще е по-добре да си напишете малък wrapper script и да зададете него като стойност на GIT_SSH. Вероятно е по-лесно просто да се използва ~/.ssh/config файла.

GIT_ASKPASS се използва за приоритет пред конфигурационната настройка core.askpass. Това е програмата, която се пуска всеки път когато Git трябва да пита потребителя зa логин информация, тя трябва да върне отговора в stdout. (Вижте Credential Storage система за повече информация).

GIT_NAMESPACE контролира достъпа до namespaced refs и е еквивалентна на флага --namespace. Това е най-полезно от страна на сървъра, където може да искате да съхранявате множество forks на единични хранилище в едно хранилище, пазейки отделни само референциите.

GIT_FLUSH може да се използва за да накарате Git да използва non-buffered I/O, когато пише инкрементално към stdout. Стойност 1 ще накара Git да flush-ва по-често, а 0 означава, че целият изход се буферира. Правилото по подразбиране (ако променливата не е настроена) е да се избере подходящата буферираща схема според активността и output режима.

GIT_REFLOG_ACTION позволява да укажете описателния текст, който се записва в reflog. Например:

$ 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