-
1. Начало
- 1.1 За Version Control системите
- 1.2 Кратка история на Git
- 1.3 Какво е Git
- 1.4 Конзолата на Git
- 1.5 Инсталиране на Git
- 1.6 Първоначална настройка на Git
- 1.7 Помощна информация в Git
- 1.8 Обобщение
-
2. Основи на Git
-
3. Клонове в Git
-
4. GitHub
-
5. Git инструменти
- 5.1 Избор на къмити
- 5.2 Интерактивно индексиране
- 5.3 Stashing и Cleaning
- 5.4 Подписване на вашата работа
- 5.5 Търсене
- 5.6 Манипулация на историята
- 5.7 Мистерията на командата Reset
- 5.8 Сливане за напреднали
- 5.9 Rerere
- 5.10 Дебъгване с Git
- 5.11 Подмодули
- 5.12 Пакети в Git (Bundling)
- 5.13 Заместване
- 5.14 Credential Storage система
- 5.15 Обобщение
-
6. Настройване на Git
- 6.1 Git конфигурации
- 6.2 Git атрибути
- 6.3 Git Hooks
- 6.4 Примерна Git-Enforced политика
- 6.5 Обобщение
-
7. Git и други системи
- 7.1 Git като клиент
- 7.2 Миграция към Git
- 7.3 Обобщение
-
8. Git на ниско ниво
- 8.1 Plumbing и Porcelain команди
- 8.2 Git обекти
- 8.3 Git референции
- 8.4 Packfiles
- 8.5 Refspec спецификации
- 8.6 Транспортни протоколи
- 8.7 Поддръжка и възстановяване на данни
- 8.8 Environment променливи
- 8.9 Обобщение
-
9. Приложение A: Git в други среди
-
10. Приложение B: Вграждане на Git в приложения
- 10.1 Git от команден ред
- 10.2 Libgit2
- 10.3 JGit
- 10.4 go-git
- 10.5 Dulwich
-
A1. Приложение C: Git команди
- A1.1 Настройки и конфигурация
- A1.2 Издърпване и създаване на проекти
- A1.3 Snapshotting
- A1.4 Клонове и сливане
- A1.5 Споделяне и обновяване на проекти
- A1.6 Инспекция и сравнение
- A1.7 Дебъгване
- A1.8 Patching
- A1.9 Email команди
- A1.10 Външни системи
- A1.11 Административни команди
- A1.12 Plumbing команди
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