-
1. 開始
-
2. Git 基礎
-
3. Git 分支
-
4. 伺服器上的 Git
- 4.1 通訊協定
- 4.2 在伺服器上取得 Git
- 4.3 產生您的 SSH 公開金鑰
- 4.4 設定伺服器
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方託管選項
- 4.10 總結
-
5. 分散式 Git
-
A1. 附錄 A:其他環境中的 Git
- A1.1 圖形介面
- A1.2 Visual Studio 中的 Git
- A1.3 Visual Studio Code 中的 Git
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的 Git
- A1.5 Sublime Text 中的 Git
- A1.6 Bash 中的 Git
- A1.7 Zsh 中的 Git
- A1.8 PowerShell 中的 Git
- A1.9 總結
-
A2. 附錄 B:將 Git 嵌入您的應用程式
-
A3. 附錄 C:Git 命令
10.8 Git 內部 - 環境變數
環境變數
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_DIR
,但未指定 --work-tree
、GIT_WORK_TREE
或 core.worktree
,則目前的工作目錄被視為您工作樹的頂層。
GIT_INDEX_FILE
是索引檔案的路徑 (僅限非裸儲存庫)。
GIT_OBJECT_DIRECTORY
可用於指定通常位於 .git/objects
的目錄位置。
GIT_ALTERNATE_OBJECT_DIRECTORIES
是一個以冒號分隔的列表(格式如 /dir/one:/dir/two:…
),它告訴 Git,如果物件不在 GIT_OBJECT_DIRECTORY
中,則應在哪裡尋找物件。如果您碰巧有很多專案,其中包含內容完全相同的大型檔案,則可以使用此選項來避免儲存過多副本。
路徑規格 (Pathspecs)
「路徑規格」是指您在 Git 中指定事物路徑的方式,包括使用萬用字元。這些用於 .gitignore
檔案,也用於命令列(git add *.c
)。
GIT_GLOB_PATHSPECS
和 GIT_NOGLOB_PATHSPECS
控制路徑規格中萬用字元的預設行為。如果 GIT_GLOB_PATHSPECS
設定為 1,萬用字元會作為萬用字元運作(這是預設值);如果 GIT_NOGLOB_PATHSPECS
設定為 1,萬用字元只會匹配它們自己,這表示像 *.c
這樣的字串只會匹配 *named* 為「\*.c」的檔案,而不是任何名稱以 .c
結尾的檔案。您可以在個別情況下覆寫此設定,方法是將路徑規格開頭加上 :(glob)
或 :(literal)
,例如 :(glob)\*.c
。
GIT_LITERAL_PATHSPECS
會停用上述兩種行為;沒有任何萬用字元會生效,而且覆寫前綴也會被停用。
GIT_ICASE_PATHSPECS
設定所有路徑規格以不區分大小寫的方式運作。
提交 (Committing)
Git 提交物件的最終建立通常由 git-commit-tree
完成,它使用這些環境變數作為其主要資訊來源,只有在這些變數不存在時才會回退到組態值。
GIT_AUTHOR_NAME
是「作者」欄位中人類可讀的名稱。
GIT_AUTHOR_EMAIL
是「作者」欄位的電子郵件。
GIT_AUTHOR_DATE
是用於「作者」欄位時間戳記的時間戳記。
GIT_COMMITTER_NAME
設定「提交者」欄位的人類名稱。
GIT_COMMITTER_EMAIL
是「提交者」欄位的電子郵件地址。
GIT_COMMITTER_DATE
用於「提交者」欄位中的時間戳記。
EMAIL
是在未設定 user.email
組態值時的回退電子郵件地址。如果連 *這個* 都未設定,Git 會回退到系統使用者和主機名稱。
網路 (Networking)
Git 使用 curl
函式庫透過 HTTP 執行網路操作,因此 GIT_CURL_VERBOSE
會告訴 Git 發出該函式庫產生的所有訊息。這類似於在命令列執行 curl -v
。
GIT_SSL_NO_VERIFY
告訴 Git 不要驗證 SSL 憑證。如果您使用自我簽署的憑證透過 HTTPS 提供 Git 儲存庫,或者您正在設定 Git 伺服器但尚未安裝完整的憑證,則有時可能需要這樣做。
如果 HTTP 操作的資料速率低於每秒 GIT_HTTP_LOW_SPEED_LIMIT
位元組的時間長度超過 GIT_HTTP_LOW_SPEED_TIME
秒,Git 將中止該操作。這些值會覆寫 http.lowSpeedLimit
和 http.lowSpeedTime
組態值。
GIT_HTTP_USER_AGENT
設定 Git 在透過 HTTP 通訊時使用的使用者代理字串。預設值類似於 git/2.0.0
。
差異和合併 (Diffing and Merging)
GIT_DIFF_OPTS
有點用詞不當。唯一有效的值是 -u<n>
或 --unified=<n>
,它們控制 git diff
命令中顯示的上下文行數。
GIT_EXTERNAL_DIFF
用作 diff.external
組態值的覆寫。如果已設定,當呼叫 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。
除錯 (Debugging)
想真正知道 Git 在做什麼嗎?Git 內建了一組相當完整的追蹤,您只需要開啟它們即可。這些變數的可能值如下:
-
「true」、「1」或「2」– 追蹤類別會寫入 stderr。
-
以
/
開頭的絕對路徑 – 追蹤輸出將寫入該檔案。
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
控制 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
啟用網路操作的封包層級追蹤。
$ 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
其他 (Miscellaneous)
如果指定了 GIT_SSH
,則在 Git 嘗試連線到 SSH 主機時,會呼叫此程式來取代 ssh
。它的呼叫方式類似 $GIT_SSH [username@]host [-p <port>] <command>
。請注意,這不是自訂呼叫 ssh
方式的最簡單方法;它不支援額外的命令列參數。若要支援額外的命令列參數,您可以使用 GIT_SSH_COMMAND
,撰寫一個包裝腳本並設定 GIT_SSH
指向它,或使用 ~/.ssh/config
檔案。
GIT_SSH_COMMAND
設定 Git 嘗試連線到 SSH 主機時使用的 SSH 命令。該命令由 shell 解譯,並且可以在 ssh
中使用額外的命令列引數,例如 GIT_SSH_COMMAND="ssh -i ~/.ssh/my_key" git clone git@example.com:my/repo
。
GIT_ASKPASS
是 core.askpass
組態值的覆寫。這是 Git 需要要求使用者提供憑證時呼叫的程式,它可以預期將文字提示作為命令列引數,並且應在 stdout
上傳回答案(有關此子系統的詳細資訊,請參閱憑證儲存)。
GIT_NAMESPACE
控制對命名空間參照的存取,並且等同於 --namespace
旗標。這在伺服器端最有用,您可能希望在一個儲存庫中儲存單個儲存庫的多個分支,僅將參照分開。
GIT_FLUSH
可用於強制 Git 在以遞增方式寫入 stdout 時使用非緩衝 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