10.8 環(huán)境變量

2018-02-24 15:22 更新

環(huán)境變量

Git 總是在一個?bash?shell 中運行,并借助一些 shell 環(huán)境變量來決定它的運行方式。 有時候,知道它們是什么以及它們?nèi)绾巫?Git 按照你想要的方式去運行會很有用。 這里不會列出所有的 Git 環(huán)境變量,但我們會涉及最有的那部分。

全局行為

像通常的程序一樣,Git 的常規(guī)行為依賴于環(huán)境變量。

GIT_EXEC_PATH?決定 Git 到哪找它的子程序 (像?git-commit,?git-diff?等等)。 你可以用?git --exec-path?來查看當前設置.

通常不會考慮修改?HOME?這個變量(太多其它東西都依賴它),這是 Git 查找全局配置文件的地方。 如果你想要一個包括全局配置的真正的便攜版 Git, 你可以在便攜版 Git 的 shell 配置中覆蓋?HOME?設置。

PREFIX?也類似,除了用于系統(tǒng)級別的配置。 Git 在?$PREFIX/etc/gitconfig?查找此文件.

如果設置了?GIT_CONFIG_NOSYSTEM,就禁用系統(tǒng)級別的配置文件。 這在系統(tǒng)配置影響了你的命令,而你又無權(quán)限修改的時候很有用。

GIT_PAGER?控制在命令行上顯示多頁輸出的程序。 如果這個沒有設置,就會用?PAGER?.

GIT_EDITOR?當用戶需要編輯一些文本(比如提交信息)時, Git 會啟動這個編輯器。 如果沒設置,就會用?EDITOR?。

版本庫位置

Git 用了幾個變量來確定它如何與當前版本庫交互。

GIT_DIR?是?.git?目錄的位置. 如果這個沒有設置, Git 會按照目錄樹逐層向上查找?.git?目錄,直到到達?~?或?/。

GIT_CEILING_DIRECTORIES?控制查找?.git?目錄的行為。 如果你訪問加載很慢的目錄(如那些磁帶機上的或通過網(wǎng)絡連接訪問的),你可能會想讓 Git 早點停止嘗試,尤其是 shell 構(gòu)建時調(diào)用了 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?目錄中的對象. 如果你有很多項目有相同內(nèi)容的大文件,這個可以用來避免存儲過多備份。

路徑規(guī)則

所謂 “pathspec” 是指你在 Git 中如何指定路徑, 包括通配符的使用。 它們會在.gitignore?文件中用到,命令行里也會用到 (git add *.c)。

GIT_GLOB_PATHSPECS?and?GIT_NOGLOB_PATHSPECS?控制通配符在路徑規(guī)則中的默認行為。 如果?GIT_GLOB_PATHSPECS?設置為 1, 通配符表現(xiàn)為通配符(這是默認設置); 如果GIT_NOGLOB_PATHSPECS?設置為 1,通配符僅匹配字面。意思是?*.c?只會匹配?文件名是.c” 的文件, 而不是以?.c?結(jié)尾的文件。 你可以在各個路徑規(guī)格中用?:(glob)?或?:(literal)?開頭來覆蓋這個配置,如?`:(glob).c`?。

GIT_LITERAL_PATHSPECS?禁用上面的兩種行為;通配符將不能用,前綴覆蓋也不能用。

GIT_ICASE_PATHSPECS?讓所有的路徑規(guī)格忽略大小寫。

提交

Git 提交對象的創(chuàng)建通常最后是由?git-commit-tree?來完成,?git-commit-tree?用這些環(huán)境變量作主要的信息源。 僅當這些值不存在才回退到預置的值。

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 繼續(xù)回退使用系統(tǒng)用戶和主機名。

網(wǎng)絡

Git 使用?curl?庫通過 HTTP來完成網(wǎng)絡操作, 所以?GIT_CURL_VERBOSE?告訴 Git 顯示所有由那個庫產(chǎn)生的消息。 這跟在命令行執(zhí)行?curl -v?差不多。

GIT_SSL_NO_VERIFY?告訴 Git 不用驗證 SSL 證書。 這在有些時候是需要的, 例如你用一個自己簽名的證書通過 HTTPS 來提供 Git 服務, 或者你正在搭建 Git 服務器,還沒有安裝完全的證書。

如果 Git 操作在網(wǎng)速低于?GIT_HTTP_LOW_SPEED_LIMIT?字節(jié)/秒,并且持續(xù)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?命令中顯示的內(nèi)容行數(shù)。

GIT_EXTERNAL_DIFF?用來覆蓋?diff.external?配置的值。 如果設置了這個值, 當執(zhí)行Gitgit diff?時,Git 會調(diào)用該程序。

GIT_DIFF_PATH_COUNTER?和?GIT_DIFF_PATH_TOTAL?對于?GIT_EXTERNAL_DIFF?或diff.external?指定的程序有用。 前者表示在一系列文件中哪個是被比較的(從 1 開始),后者表示每批文件的總數(shù)。

GIT_MERGE_VERBOSITY?控制遞歸合并策略的輸出。 允許的值有下面這些:

  • 0 什么都不輸出,除了可能會有一個錯誤信息。

  • 1 只顯示沖突。

  • 2 還顯示文件改變。

  • 3 顯示因為沒有改變被跳過的文件。

  • 4 顯示處理的所有路徑。

  • 5 顯示詳細的調(diào)試信息。

默認值是 2.

調(diào)試

想?真正地?知道 Git 正在做什么? Git 內(nèi)置了相當完整的跟蹤信息,你需要做的就是把它們打開。 這些變量的可以用的值如下:

  • “true”, “1”, 或 “2” – 跟蹤類別寫到標準錯誤輸出.

  • 以?/?開頭的絕對路徑 – 跟蹤輸出會被寫到那個文件。

GIT_TRACE?控制常規(guī)跟蹤,它并不適用于特殊情況。 它跟蹤的范圍包括別名的展開和其他子程序的委托。

$ 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?打開網(wǎng)絡操作包級別的跟蹤信息

$ 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?控制性能數(shù)據(jù)的日志打印。 輸出顯示了每個 Git 命令調(diào)用花費的時間。

$ 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 發(fā)現(xiàn)的關(guān)于版本庫和交互環(huán)境的信息

$ 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>?的命令方式調(diào)用。 這不是配置定制ssh?調(diào)用方式的最簡單的方法; 它不支持額外的命令行參數(shù), 所以你必須寫一個封裝腳本然后讓GIT_SSH?指向它。 可能用?~/.ssh/config?會更簡單。

GIT_ASKPASS?覆蓋了?core.askpass?配置。 這是 Git 需要向用戶請求驗證時用到的程序,它接受一個文本提示作為命令行參數(shù),并在?stdout?中返回應答。 (查看?憑證存儲_ 訪問更多相關(guān)內(nèi)容)

GIT_NAMESPACE?控制有命令空間的引用的訪問,與?--namespace?標志是相同的. 這主要在服務器端有用, 如果你想在一個版本庫中存儲單個版本庫的多個 fork, 只要保持引用是隔離的就可以。

GIT_FLUSH?強制 Git 在向標準輸出增量寫入時使用沒有緩存的 I/O。 設置為 1 讓 Git 刷新更多, 設置為 0 則使所有的輸出被緩存。 默認值(若此變量未設置)是根據(jù)活動和輸出模式的不同選擇合適的緩存方案。

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
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號