環境變數
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 lga20: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 status20:10:12.081397 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 1220:10:12.081886 sha1_file.c:2088 .git/objects/pack/pack-c3fa...291e.pack 3466220: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 5691498320:10:12.087419 sha1_file.c:2088 .git/objects/pack/pack-e80e...e3d2.pack 14303666On branch masterYour branch is up-to-date with 'origin/master'.nothing to commit, working directory clean
GIT_TRACE_PACKET 開啟網路操作包層級的跟蹤資訊
$ GIT_TRACE_PACKET=