簡體   English   中英

我的 Git 配置中的設置來自哪里?

[英]Where do the settings in my Git configuration come from?

我注意到當我運行git config -l時,我有兩個core.autocrlf列表

$ git config -l
core.symlinks=false
core.autocrlf=false
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
pack.packsizelimit=2g
help.format=html
http.sslcainfo=/bin/curl-ca-bundle.crt
sendemail.smtpserver=/bin/msmtp.exe
diff.astextplain.textconv=astextplain
rebase.autosquash=true
user.name=name
user.email=email@example.com
core.autocrlf=true

最后三個(從 user.name 開始)是我的C:\\users\\username\\.gitconfig文件中唯一的。 其他的都是從哪里來的? 為什么 core.autocrlf 被列出兩次?

這是 MSysGit 1.8.3,我還安裝了 Sourcetree(Windows 7)。 在 Sourcetree 中,我取消選中“允許 Sourcetree 修改您的全局 Git 配置文件”

Git 檢查配置文件的四個位置:

  1. 您機器的系統.gitconfig文件。
  2. 您的用戶.gitconfig文件位於~/.gitconfig
  3. 第二個用戶特定的配置文件位於$XDG_CONFIG_HOME/git/config$HOME/.config/git/config
  4. 本地存儲庫的配置文件.git/config

設置按以下順序級聯,每個文件添加或覆蓋其上方文件中定義的設置。

  1. 系統配置。
  2. 用戶配置。
  3. 特定於存儲庫的配置。

您可以使用以下命令查看每個文件的定義:

# System, applies to entire machine and all users
$ git config --system --list
$ git config --system --edit

# User defined
$ git config --global --list
$ git config --global --edit

您可以通過打開該存儲庫的文件.git/config來查看特定於存儲庫的文件定義的內容。

如果您在 Windows 上使用 MSysGit,如果您在 Windows 命令提示符下使用echo %homepath% ,您可能會在%homepath%指向的地方找到您的用戶~/.gitconfig文件。

來自git config文檔

如果未使用--file明確設置,則git config將在四個文件中搜索配置選項:

  • $(prefix)/etc/gitconfig

    系統范圍的配置文件。

  • $XDG_CONFIG_HOME/git/config

第二個特定於用戶的配置文件。 如果$XDG_CONFIG_HOME未設置或為空,則將使用$HOME/.config/git/config 此文件中設置的任何單值變量都將被~/.gitconfig任何內容覆蓋。 如果您有時使用舊版本的 Git,最好不要創建此文件,因為最近才添加了對該文件的支持。

  • ~/.gitconfig

用戶特定的配置文件。 也稱為“全局”配置文件。

  • $GIT_DIR/config

    存儲庫特定的配置文件。

如果沒有給出更多選項,所有讀取選項將讀取所有這些可用文件。 如果全局或系統范圍的配置文件不可用,它們將被忽略。 如果存儲庫配置文件不可用或不可讀, git config將退出並顯示非零錯誤代碼。 但是,在任何情況下都不會發出錯誤消息。

文件按上面給出的順序讀取,發現的最后一個值優先於之前讀取的值。 當采用多個值時,將使用來自所有文件的鍵的所有值。

默認情況下,所有寫入選項都將寫入存儲庫特定的配置文件。 請注意,這也會影響--unset --replace-all--unset等選項。 git config一次只會更改一個文件。

您可以通過命令行選項或環境變量覆蓋這些規則。 --global--system選項將分別將使用的文件限制為全局或系統范圍的文件。 GIT_CONFIG環境變量具有類似的效果,但您可以指定任何您想要的文件名。

使用 git 2.8,您不必再猜測哪個配置已設置在何處! (2016 年 3 月)

參見提交 70bd879提交 473166b提交 7454ee3提交 7454ee3 (2016 年 2 月 19 日)、 提交 473166b提交 7454ee3 (2016 年 2 月 19 日)、 提交 7454ee3 (2016 年 2 月 19 日)、 提交 7454ee3 (2016 年 2 月 19 日) larsxschneider 2016 年 2 月 17 日)和提交)
(由Junio C gitster合並-- gitster --dd0f567 提交中,2016 年 2 月 26 日)

配置:添加“ --show-origin ”選項以打印配置值的來源

如果使用“ git config ”(例如通過--get--get-all--get-regexp--list標志)查詢配置值,則有時很難找到定義值的配置文件.

教 ' git config ' ' --show-origin ' 選項為每個打印值打印源配置文件。

git config手冊頁現在將指示:

--show-origin:

使用源類型(文件、標准輸入、blob、命令行)和實際源(配置文件路徑、ref 或 blob id,如果適用)增加所有查詢配置選項的輸出。

例如:

git config --list --show-origin

那將返回:

    file:$HOME/.gitconfig   user.global=true
    file:$HOME/.gitconfig   user.override=global
    file:$HOME/.gitconfig   include.path=$INCLUDE_DIR/absolute.include
    file:$INCLUDE_DIR/absolute.include  user.absolute=include
    file:.git/config    user.local=true
    file:.git/config    user.override=local
    file:.git/config    include.path=../include/relative.include
    file:.git/../include/relative.include   user.relative=include
    command line:   user.cmdline=true

對於一種設置,正如wisbucky 評論那樣

git config --show-origin --get-all core.autocrlf

    file:"D:\\prgs\\git\\latest\\mingw64/etc/gitconfig"     true
    file:C:/Users/vonc/.gitconfig   false

在 Git 2.26(2020 年第一季度)中,您可以添加--show-scope選項

git config -l --show-origin --show-scope

在之前為 Windows安裝了Git並隨后將其卸載后,我發現在C:\\Users\\All Users\\Git\\config安裝了一個配置文件,這是一個系統級配置文件,它會持續存在並將影響任何未來的 MinGW32 Git 包(就我而言,我正在運行我公司提供的便攜式 MinGW32 Git 包)。 當我跑

git config --system --edit

它會向我顯示位於mingw32/etc/gitconfig的系統配置文件,但它仍然會從第一個位置加載值。 這顯示為嘗試使用Git LFS時配置值發生沖突的警告。

WARNING: These git config values clash:
  git config "http.sslcainfo" = "C:/Users/foo/AppData/Local/Programs/Git/mingw64/ssl/certs/ca-bundle.crt"
  git config "http.sslcainfo" = "/ssl/certs/ca-bundle.crt"

(注意:這也可能是 LFS 警告過於自信的情況, #861

您可以使用--show-origin來找出配置的來源。

Windows 版 Git 中的配置文件優先級:

...

$PROGRAMDATA/Git/config ::
(僅限 Windows)與其他 Git 實現共享的系統范圍的配置文件。 通常$PROGRAMDATA指向C:\\ProgramData

$(prefix)/etc/gitconfig ::
系統范圍的配置文件。 (僅限 Windows)此文件僅包含特定於此 Windows 版 Git 安裝的設置,不應與其他 Git 實現(如 JGit、libgit2)共享。 --system將選擇此文件。

$XDG_CONFIG_HOME/git/config ::
第二個特定於用戶的配置文件。 如果$XDG_CONFIG_HOME未設置或為空,則將使用$HOME/.config/git/config 此文件中設置的任何單值變量都將被~/.gitconfig任何內容覆蓋。 如果您有時使用舊版本的 Git,最好不要創建此文件,因為最近才添加了對該文件的支持。

~/.gitconfig ::
用戶特定的配置文件。 也稱為“全局”配置文件。

$GIT_DIR/config ::
存儲庫特定的配置文件。

...

文件按上面給出的順序讀取,發現的最后一個值優先於之前讀取的值。

...

來源: https : //github.com/git-for-windows/git/blob/master@%7B2018-01-07%7D/Documentation/git-config.txt#L231

$PROGRAMDATA是一個環境變量。 您可以像這樣獲取這些變量的值:

在 Git Bash 中,您需要使用echo "$ProgramData" 在 CMD 中,您需要使用echo %PROGRAMDATA% 請注意,Git Bash 顯然假裝環境變量區分大小寫。

什么是$(prefix)

前綴是安裝東西的頂級目錄。 在 Windows 版 Git 中,它是<some-path>/mingw64<some-path>/mingw32

除了我在此處介紹git config -l --show-origin和 git 2.8(2016 年 3 月)之外,您現在還擁有 Git 2.26(2020 年第一季度)

git config -l --show-scope

# you can combine both options:
git config -l --show-origin --show-scope

git config學會了顯示每個配置設置來自哪個“ scope ”,除了在哪個文件中。

請參閱提交 145d59f提交 9a83d08提交 e37efa4提交 5c105a8提交 6766e41提交 6dc905d提交 a5cb420 (2020 年 2 月 10 日),以及提交 417be08 (2020 年 2 月 10 日), 提交 417be07 ee23提交2020 年 4 月29日 29 年 3 月29馬修 2929提交 2929日 2009 年 3 月ROGERSM94
(由Junio C gitster合並-- gitster -- in commit 5d55554 ,2020 年 2 月 17 日)

config : 添加“--show-scope”以打印配置值的范圍

簽字人:馬修·羅傑斯

當用戶使用--show-origin查詢配置值時,通常很難確定給定值的實際“ scope ”( localglobal等)僅基於原始文件。

教 'git config' ' --show-scope ' 選項打印所有顯示的配置值的范圍。

請注意,我們永遠不應該看到任何“子模塊”范圍,因為它只會在解析“.gitmodules”文件時被submodule-config.c使用。

例子:

git config -l --show-scope

global  user.global=true
global  user.override=global
global  include.path=$INCLUDE_DIR/absolute.include
global  user.absolute=include
local   user.local=true
local   user.override=local
local   include.path=../include/relative.include
local   user.relative=include

git config -l顯示所有從系統、全局和本地繼承的值。

所以你有另一個配置文件與你的用戶定義的.gitconfig文件一起加載。

Windows 的完整答案(即已接受答案的 Windows 版本):

與 Linux 一樣,Windows 有四個級別的配置文件/設置,其中三個是直接等效的。 需要注意的重要事項是另一個 - “所有應用程序/用戶” - 特別是因為這是安裝程序設置值的地方,例如“core.autocrlf = true”,但無法從命令行訪問所以它會引起混亂。

所有應用程序和用戶

如果您安裝了多個 Git 應用程序,這就像“系統”設置的共享版本。 沒有 'git config' 命令來訪問這些,但它們仍然影響設置的最終結果。

配置文件位置:

C:\\ProgramData\\Git\\config

(請注意,在舊版本的 Windows 上,“ProgramData”是“所有用戶”。)

系統

配置文件位置:C:/Program Files/Git/mingw64/etc/gitconfig

$ git config --system --list

用戶

配置文件位置:%USERPROFILE%.gitconfig(這解析為'C:/Users/<username>')

$ git config --global --list

存儲庫

配置文件位置:【當前倉庫目錄】/.git/config

$ git config --local --list

在 Windows 7(可能與 Windows 10 相同或相似)上,對於 Visual Studio 和 Git 命令行,您的全局配置位於:

%USERPROFILE%\.gitconfig

(點在文件名前面)

但是Sourcetree並不尊重這個,至少在Git Embedded模式下是這樣,配置在:

%USERPROFILE%\AppData\Local\Atlassian\SourceTree\git_local\mingw32\etc\gitconfig

(文件名前沒有點)

(我需要更新這兩個文件以修改 Git 命令和 Sourcetree 的全局 Git 設置。)

另一個有趣的部分。 Git 鈎子配置在AppData\\Local\\...位置工作,但經過Process Monitor 的更多研究后,我注意到 Sourcetree 也以某種方式從公司映射驅動器為我的用戶加載全局。

這沒什么意義,因為很少有應用程序會查找此位置,但 Sourcetree 以某種方式這樣做,因此如果您無法在 Sourcetree 的每個位置設置中使用它,請運行 Process Monitor 並創建規則以僅記錄包含 gitconfig 的路徑,然后您在網絡映射用戶目錄的情況下,可以找到您的全局配置的真正位置。

這甚至可能不是 Sourcetree 的錯,正如我現在看到的,當我寫這篇文章時,git.exe 正在加載它,但這僅發生在 Sourcetree 執行的 git.exe 上,而直接命令行 Git 使用%USERPROFILE%\\.gitconfig

在此處輸入圖片說明

最后,我從 Process Monitor 獲取所有結果,將其輸入 SQL Server 並運行查詢以獲得不同的結果(沒有特定的執行順序只是按路徑排序):

在此處輸入圖片說明

我不知道這些配置是如何相互關聯的,但我知道有些會覆蓋另一個,有些設置在一個位置工作,有些在另一個位置工作。

上面的列表由 Sourcetree 調用,再次使用 Git 直接命令行似乎與%USERPROFILE%\\.gitconfig一起工作正常,這不在此列表中,但它看起來像這樣(在 Windows 7 上) C:\\Users\\pawel.cioch\\.gitconfig

如果您想查找實際文件位置,它將在您的主目錄中。

它被隱藏並以“.”開頭。

因此,如果您使用的是 Mac,則可以在終端中cd ~ && open .gitconfig或使用您喜歡的文本編輯器打開它,例如cd ~ && atom .gitconfig

在 mac 中,它是/usr/local/git/etc/gitconfig -_-

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM