# 環境變量
Git 總是在一個?`bash`?shell 中運行,并借助一些 shell 環境變量來決定它的運行方式。 有時候,知道它們是什么以及它們如何讓 Git 按照你想要的方式去運行會很有用。 這里不會列出所有的 Git 環境變量,但我們會涉及最有的那部分。
## 全局行為
像通常的程序一樣,Git 的常規行為依賴于環境變量。
**`GIT_EXEC_PATH`**?決定 Git 到哪找它的子程序 (像?`git-commit`,?`git-diff`?等等)。 你可以用?`git --exec-path`?來查看當前設置.
通常不會考慮修改?**`HOME`**?這個變量(太多其它東西都依賴它),這是 Git 查找全局配置文件的地方。 如果你想要一個包括全局配置的真正的便攜版 Git, 你可以在便攜版 Git 的 shell 配置中覆蓋?`HOME`?設置。
**`PREFIX`**?也類似,除了用于系統級別的配置。 Git 在?`$PREFIX/etc/gitconfig`?查找此文件.
如果設置了?**`GIT_CONFIG_NOSYSTEM`**,就禁用系統級別的配置文件。 這在系統配置影響了你的命令,而你又無權限修改的時候很有用。
**`GIT_PAGER`**?控制在命令行上顯示多頁輸出的程序。 如果這個沒有設置,就會用?`PAGER`?.
**`GIT_EDITOR`**?當用戶需要編輯一些文本(比如提交信息)時, Git 會啟動這個編輯器。 如果沒設置,就會用?`EDITOR`?。
## 版本庫位置
Git 用了幾個變量來確定它如何與當前版本庫交互。
**`GIT_DIR`**?是?`.git`?目錄的位置. 如果這個沒有設置, Git 會按照目錄樹逐層向上查找?`.git`?目錄,直到到達?`~`?或?`/`。
**`GIT_CEILING_DIRECTORIES`**?控制查找?`.git`?目錄的行為。 如果你訪問加載很慢的目錄(如那些磁帶機上的或通過網絡連接訪問的),你可能會想讓 Git 早點停止嘗試,尤其是 shell 構建時調用了 Git 。
**`GIT_WORK_TREE`**?是非空版本庫的工作目錄的根路徑 如果沒指定,就使用?`$GIT_DIR`?的父目錄。
**`GIT_INDEX_FILE`**?是索引文件的路徑(只有非空版本庫有)
**`GIT_OBJECT_DIRECTORY`**?用來指定?`.git/objects`?目錄的位置。
**`GIT_ALTERNATE_OBJECT_DIRECTORIES`**?一個冒號分割的列表 (格式類似`/dir/one:/dir/two:…`) 用來告訴 Git 到哪里去找不在?`GIT_OBJECT_DIRECTORY`?目錄中的對象. 如果你有很多項目有相同內容的大文件,這個可以用來避免存儲過多備份。
## 路徑規則
所謂 “pathspec” 是指你在 Git 中如何指定路徑, 包括通配符的使用。 它們會在`.gitignore`?文件中用到,命令行里也會用到 (`git add *.c`)。
**`GIT_GLOB_PATHSPECS`?and?`GIT_NOGLOB_PATHSPECS`**?控制通配符在路徑規則中的默認行為。 如果?`GIT_GLOB_PATHSPECS`?設置為 1, 通配符表現為通配符(這是默認設置); 如果`GIT_NOGLOB_PATHSPECS`?設置為 1,通配符僅匹配字面。意思是?`*.c`?只會匹配?*文件名是*“*.c” 的文件, 而不是以?`.c`?結尾的文件。 你可以在各個路徑規格中用?`:(glob)`?或?`:(literal)`?開頭來覆蓋這個配置,如?`:(glob)*.c`?。
**`GIT_LITERAL_PATHSPECS`**?禁用上面的兩種行為;通配符將不能用,前綴覆蓋也不能用。
**`GIT_ICASE_PATHSPECS`**?讓所有的路徑規格忽略大小寫。
## 提交
Git 提交對象的創建通常最后是由?`git-commit-tree`?來完成,?`git-commit-tree`?用這些環境變量作主要的信息源。 僅當這些值不存在才回退到預置的值。
**`GIT_AUTHOR_NAME`**?是 “author” 字段的可讀的名字。
**`GIT_AUTHOR_EMAIL`**?是 “author” 字段的郵件。
**`GIT_AUTHOR_DATE`**?是 “author” 字段的時間戳。
**`GIT_COMMITTER_NAME`**?是 “committer” 字段的可讀的名字。
**`GIT_COMMITTER_EMAIL`**?是 “committer” 字段的郵件。
**`GIT_COMMITTER_DATE`**?是 “committer” 字段的時間戳。
如果?`user.email`?沒有配置, 就會用到?**`EMAIL`**?指定的郵件地址。 如果?*這個*?也沒有設置, Git 繼續回退使用系統用戶和主機名。
## 網絡
Git 使用?`curl`?庫通過 HTTP來完成網絡操作, 所以?**`GIT_CURL_VERBOSE`**?告訴 Git 顯示所有由那個庫產生的消息。 這跟在命令行執行?`curl -v`?差不多。
**`GIT_SSL_NO_VERIFY`**?告訴 Git 不用驗證 SSL 證書。 這在有些時候是需要的, 例如你用一個自己簽名的證書通過 HTTPS 來提供 Git 服務, 或者你正在搭建 Git 服務器,還沒有安裝完全的證書。
如果 Git 操作在網速低于?**`GIT_HTTP_LOW_SPEED_LIMIT`**?字節/秒,并且持續**`GIT_HTTP_LOW_SPEED_TIME`**?秒以上的時間,Git 會終止那個操作。 這些值會覆蓋`http.lowSpeedLimit`?和?`http.lowSpeedTime`?配置的值。
**`GIT_HTTP_USER_AGENT`**?設置 Git 在通過 HTTP 通訊時用到的 user-agent。 默認值類似于`git/2.0.0`?。
## 比較和合并
**`GIT_DIFF_OPTS`**?這個有點起錯名字了 有效值僅支持?`-u<n>`?或?`--unified=<n>`,用來控制在?`git diff`?命令中顯示的內容行數。
**`GIT_EXTERNAL_DIFF`**?用來覆蓋?`diff.external`?配置的值。 如果設置了這個值, 當執行Git`git diff`?時,Git 會調用該程序。
**`GIT_DIFF_PATH_COUNTER`**?和?**`GIT_DIFF_PATH_TOTAL`**?對于?`GIT_EXTERNAL_DIFF`?或`diff.external`?指定的程序有用。 前者表示在一系列文件中哪個是被比較的(從 1 開始),后者表示每批文件的總數。
**`GIT_MERGE_VERBOSITY`**?控制遞歸合并策略的輸出。 允許的值有下面這些:
* 0 什么都不輸出,除了可能會有一個錯誤信息。
* 1 只顯示沖突。
* 2 還顯示文件改變。
* 3 顯示因為沒有改變被跳過的文件。
* 4 顯示處理的所有路徑。
* 5 顯示詳細的調試信息。
默認值是 2.
## 調試
想?*真正地*?知道 Git 正在做什么? Git 內置了相當完整的跟蹤信息,你需要做的就是把它們打開。 這些變量的可以用的值如下:
* “true”, “1”, 或 “2” – 跟蹤類別寫到標準錯誤輸出.
* 以?`/`?開頭的絕對路徑 – 跟蹤輸出會被寫到那個文件。
**`GIT_TRACE`**?控制常規跟蹤,它并不適用于特殊情況。 它跟蹤的范圍包括別名的展開和其他子程序的委托。
~~~
$ 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`**?控制訪問打包文件的跟蹤信息 第一個字段是被訪問的打包文件,第二個是文件的偏移量:
~~~
$ 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`**?打開網絡操作包級別的跟蹤信息
~~~
$ 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'
~~~
**`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`**, Git 連接 SSH 主機時會用指定的程序代替?`ssh`?。 它會被用`$GIT_SSH [username@]host [-p <port>] <command>`?的命令方式調用。 這不是配置定制`ssh`?調用方式的最簡單的方法; 它不支持額外的命令行參數, 所以你必須寫一個封裝腳本然后讓`GIT_SSH`?指向它。 可能用?`~/.ssh/config`?會更簡單。
**`GIT_ASKPASS`**?覆蓋了?`core.askpass`?配置。 這是 Git 需要向用戶請求驗證時用到的程序,它接受一個文本提示作為命令行參數,并在?`stdout`?中返回應答。 (查看?[憑證存儲](http://git-scm.com/book/zh/v2/1-git-tools/_credential_caching)_ 訪問更多相關內容)
**`GIT_NAMESPACE`**?控制有命令空間的引用的訪問,與?`--namespace`?標志是相同的. 這主要在服務器端有用, 如果你想在一個版本庫中存儲單個版本庫的多個 fork, 只要保持引用是隔離的就可以。
**`GIT_FLUSH`**?強制 Git 在向標準輸出增量寫入時使用沒有緩存的 I/O。 設置為 1 讓 Git 刷新更多, 設置為 0 則使所有的輸出被緩存。 默認值(若此變量未設置)是根據活動和輸出模式的不同選擇合適的緩存方案。
**`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
~~~
- 前言
- Scott Chacon 序
- Ben Straub 序
- 獻辭
- 貢獻者
- 引言
- 1. 起步
- 1.1 關于版本控制
- 1.2 Git 簡史
- 1.3 Git 基礎
- 1.4 命令行
- 1.5 安裝 Git
- 1.6 初次運行 Git 前的配置
- 1.7 獲取幫助
- 1.8 總結
- 2. Git 基礎
- 2.1 獲取 Git 倉庫
- 2.2 記錄每次更新到倉庫
- 2.3 查看提交歷史
- 2.4 撤消操作
- 2.5 遠程倉庫的使用
- 2.6 打標簽
- 2.7 Git 別名
- 2.8 總結
- 3. Git 分支
- 3.1 分支簡介
- 3.2 分支的新建與合并
- 3.3 分支管理
- 3.4 分支開發工作流
- 3.5 遠程分支
- 3.6 變基
- 3.7 總結
- 4. 服務器上的 Git
- 4.1 協議
- 4.2 在服務器上搭建 Git
- 4.3 生成 SSH 公鑰
- 4.4 配置服務器
- 4.5 Git 守護進程
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方托管的選擇
- 4.10 總結
- 5. 分布式 Git
- 5.1 分布式工作流程
- 5.2 向一個項目貢獻
- 5.3 維護項目
- 5.4 總結
- 6. GitHub
- 6.1 賬戶的創建和配置
- 6.2 對項目做出貢獻
- 6.3 維護項目
- 6.4 管理組織
- 6.5 腳本 GitHub
- 6.6 總結
- 7. Git 工具
- 7.1 選擇修訂版本
- 7.2 交互式暫存
- 7.3 儲藏與清理
- 7.4 簽署工作
- 7.5 搜索
- 7.6 重寫歷史
- 7.7 重置揭密
- 7.8 高級合并
- 7.9 Rerere
- 7.10 使用 Git 調試
- 7.11 子模塊
- 7.12 打包
- 7.13 替換
- 7.14 憑證存儲
- 7.15 總結
- 8. 自定義 Git
- 8.1 配置 Git
- 8.2 Git 屬性
- 8.3 Git 鉤子
- 8.4 使用強制策略的一個例子
- 8.5 總結
- 9. Git 與其他系統
- 9.1 作為客戶端的 Git
- 9.2 遷移到 Git
- 9.3 總結
- 10. Git 內部原理
- 10.1 底層命令和高層命令
- 10.2 Git 對象
- 10.3 Git 引用
- 10.4 包文件
- 10.5 引用規格
- 10.6 傳輸協議
- 10.7 維護與數據恢復
- 10.8 環境變量
- 10.9 總結
- A. 其它環境中的 Git
- A1.1 圖形界面
- A1.2 Visual Studio 中的 Git
- A1.3 Eclipse 中的 Git
- A1.4 Bash 中的 Git
- A1.5 Zsh 中的 Git
- A1.6 Powershell 中的 Git
- A1.7 總結
- B. 將 Git 嵌入你的應用
- A2.1 命令行 Git 方式
- A2.2 Libgit2
- A2.3 JGit
- C. Git 命令
- A3.1 設置與配置
- A3.2 獲取與創建項目
- A3.3 快照基礎
- A3.4 分支與合并
- A3.5 項目分享與更新
- A3.6 檢查與比較
- A3.7 調試
- A3.8 補丁
- A3.9 郵件
- A3.10 外部系統
- A3.11 管理
- A3.12 底層命令