Các cài đặt trong cấu hình Git của tôi đến từ đâu?


87

Tôi nhận thấy rằng tôi có hai danh sách core.autocrlfkhi tôi chạygit config -l

$ 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

Ba cuối cùng (từ user.name trở xuống) là những cái duy nhất trong C:\users\username\.gitconfigtệp của tôi . Tất cả những cái khác đến từ đâu? Tại sao core.autocrlf được liệt kê hai lần?

Đây là với MSysGit 1.8.3 và tôi cũng đã cài đặt Sourcetree (Windows 7). Trong Sourcetree, tôi đã bỏ chọn "Cho phép Sourcetree sửa đổi tệp cấu hình Git chung của bạn"


17
Lưu ý: với git 2.8 (tháng 3 năm 2016) và git config --list --show-origin, bạn sẽ không phải đoán cấu hình git ở đâu. Xem câu trả lời của tôi bên dưới
VonC

Câu trả lời:


97

Git kiểm tra bốn vị trí cho một tệp cấu hình:

  1. Tệp hệ thống của máy của bạn .gitconfig.
  2. Tệp người dùng của bạn được .gitconfigđặt tại ~/.gitconfig.
  3. Tệp cấu hình dành riêng cho người dùng thứ hai nằm tại $XDG_CONFIG_HOME/git/confighoặc $HOME/.config/git/config.
  4. Tệp cấu hình của kho lưu trữ cục bộ .git/config.

Cài đặt phân tầng theo thứ tự sau, với mỗi tệp thêm hoặc ghi đè cài đặt được xác định trong tệp phía trên tệp.

  1. Cấu hình hệ thông.
  2. Cấu hình người dùng.
  3. Cấu hình dành riêng cho kho lưu trữ.

Bạn có thể xem từng tệp đã xác định những gì bằng các lệnh sau:

# 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

Bạn có thể xem chỉ tệp .git/configdành riêng cho kho lưu trữ đã xác định những gì bằng cách mở tệp cho kho đó.

Nếu bạn đang sử dụng MSysGit trên Windows, bạn có thể sẽ tìm thấy ~/.gitconfigtệp người dùng của mình ở nơi bạn từng %homepath%trỏ đến nếu bạn sử dụng echo %homepath%từ dấu nhắc lệnh Windows.

Từ tài liệu chogit config :

Nếu không được đặt rõ ràng với --file, có bốn tệp git configsẽ tìm kiếm các tùy chọn cấu hình:

  • $(prefix)/etc/gitconfig

    Tệp cấu hình toàn hệ thống.

  • $XDG_CONFIG_HOME/git/config

Tệp cấu hình dành riêng cho người dùng thứ hai. Nếu $XDG_CONFIG_HOMEkhông được đặt hoặc trống, $HOME/.config/git/configsẽ được sử dụng. Bất kỳ biến có giá trị đơn nào được đặt trong tệp này sẽ bị ghi đè bởi bất kỳ biến nào có trong đó ~/.gitconfig. Bạn không nên tạo tệp này nếu đôi khi bạn sử dụng các phiên bản Git cũ hơn, vì hỗ trợ cho tệp này đã được bổ sung gần đây.

  • ~/.gitconfig

Tệp cấu hình dành riêng cho người dùng. Còn được gọi là tệp cấu hình "toàn cầu".

  • $GIT_DIR/config

    Tệp cấu hình cụ thể của kho lưu trữ.

Nếu không có tùy chọn nào khác được đưa ra, tất cả các tùy chọn đọc sẽ đọc tất cả các tệp có sẵn này. Nếu tệp cấu hình chung hoặc toàn hệ thống không có sẵn, chúng sẽ bị bỏ qua. Nếu tệp cấu hình kho lưu trữ không có sẵn hoặc không thể đọc được, git configsẽ thoát với mã lỗi khác 0. Tuy nhiên, trong cả hai trường hợp đều không có thông báo lỗi.

Các tệp được đọc theo thứ tự đã cho ở trên, với giá trị cuối cùng được tìm thấy được ưu tiên hơn các giá trị đã đọc trước đó. Khi nhiều giá trị được lấy thì tất cả các giá trị của một khóa từ tất cả các tệp sẽ được sử dụng.

Tất cả các tùy chọn ghi theo mặc định sẽ ghi vào tệp cấu hình cụ thể của kho lưu trữ. Lưu ý rằng điều này cũng ảnh hưởng đến các tùy chọn như --replace-all--unset. git config sẽ chỉ thay đổi từng tệp một.

Bạn có thể ghi đè các quy tắc này bằng các tùy chọn dòng lệnh hoặc bằng các biến môi trường. Các --globalvà các --systemtùy chọn này sẽ hạn chế các tập tin sử dụng để tập tin toàn cầu hoặc toàn hệ thống tương ứng. Biến GIT_CONFIGmôi trường có tác dụng tương tự, nhưng bạn có thể chỉ định bất kỳ tên tệp nào bạn muốn.


3
" .gitconfigTệp hệ thống của máy " ở đâu khi chạy trên Windows với msysgit?
DanielSank

3
@DanielSank hãy thử C:\Program Files (x86)\Git\etc\gitconfig. Tuy nhiên, không chắc liệu đó có phải là một trong những quyền.

@Cupcake: Đúng vậy. Vì một số lý do, tôi không thể sửa đổi tệp đó. Một số quá trình đang giữ nó ... không thể tìm ra cái nào. Tôi đoán nó không quan trọng vì tôi chỉ có thể ghi đè trong cấu hình cấp người dùng. Cảm ơn.
DanielSank

2
Git hiện tại đọcC:\Program Files\Git\mingw64\etc\gitconfig
Kevin Smyth

1
@KevinSmyth, điều này gần đây đã thay đổi thànhC:\Program Files\Git\etc\gitconfig
Enrice

62

Bạn không cần phải đoán nữa xem cấu hình nào đã được đặt ở đâu, với git 2.8! (Tháng 3 năm 2016)

Xem cam kết 70bd879 , cam kết 473166b , cam kết 7454ee3 , cam kết 7454ee3 (ngày 19 tháng 2 năm 2016), cam kết 473166b , cam kết 7454ee3 (ngày 19 tháng 2 năm 2016), cam kết 7454ee3 (ngày 19 tháng 2 năm 2016) và cam kết a0578e0 (ngày 17 tháng 2 năm 2016) bởi Lars Schneider ( larsxschneider) .
(Hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết dd0f567 , ngày 26 tháng 2 năm 2016)

config: add ' --show-origin' option để in nguồn gốc của giá trị config

Nếu giá trị cấu hình được truy vấn sử dụng ' git config' (ví dụ qua --get, --get-all, --get-regexp, hoặc --listcờ) thì đó là đôi khi khó có thể tìm thấy các tập tin cấu hình mà các giá trị được xác định.

Dạy ' git config' --show-origintùy chọn '' để in tệp cấu hình nguồn cho mọi giá trị được in.

Các git configtrang người đàn ông bây giờ sẽ chỉ ra:

--show-origin:

Tăng cường kết quả đầu ra của tất cả các tùy chọn cấu hình được truy vấn với kiểu gốc (tệp, đầu vào chuẩn, blob, dòng lệnh) và nguồn gốc thực (đường dẫn tệp cấu hình, ref hoặc blob id nếu có).

Ví dụ:

git config --list --show-origin

Điều đó sẽ trở lại:

    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

Đối với một cài đặt, như được bình luận bởi Wisdombucky :

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

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

Với Git 2.26 (Q1 2020), bạn có thể thêm --show-scopetùy chọn :

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

1
cảm ơn chúa. Vì vậy, nhiều bài báo khác nhau trực tuyến đoán về nơi các cấu hình git có thể đã được lưu trữ. Tất cả các bài viết đều bỏ sót một vị trí có thể xảy ra khi thiết lập trên máy của tôi: c: \ programdata \ git \ config. Không biết tại sao nó ở đó, nhưng tôi nghi ngờ sự tích hợp TFS của Visual Studio. Các vị trí kỳ lạ khác mà tôi dành quá nhiều thời gian để tìm kiếm là: C: \ program files \ mingw64 \ etc \ .gitconfig và H: \. Gitconfig. Cảm ơn chúa vì lệnh mới này. Chúa ơi. Đấng Christ.
RMuesi

Tôi tự hỏi tại sao user.cmdline=trueđược yêu cầu --show-originđể làm việc? Ngoài ra, tôi nhận thấy rằng --show-origincần phải ngay sau configđó để làm việc với --get--get-all. Vì vậy, nó phải được... config --show-origin --get-all core.autocrlf
wisbucky

@wisbucky Đồng ý: Tôi xóa -c 'user.cmdline=true'bit, có vẻ như đề cập đến phạm vi kiểm tra: github.com/git/git/blob/…
VonC

@wisbucky Và tôi đã bao gồm ví dụ của bạn cho một cài đặt.
VonC

@VonC, Ah có vẻ như user.cmdline=truecần thiết trong Git 2.13, nhưng không còn cần thiết trong Git 2.15 nữa.
khôn ngoan

10

Sau khi đã cài đặt Git cho Windows trước đó và sau đó gỡ cài đặt nó, tôi thấy rằng có một tệp cấu hình được cài đặt tại C:\Users\All Users\Git\configđó là tệp cấu hình cấp hệ thống vẫn tồn tại và sẽ ảnh hưởng đến bất kỳ gói MinGW32 Git nào trong tương lai (trong trường hợp của tôi, tôi đang chạy MinGW32 di động Gói Git do công ty của tôi cung cấp). Khi tôi chạy

git config --system --edit

nó sẽ hiển thị cho tôi tệp cấu hình hệ thống được đặt tại mingw32/etc/gitconfig, nhưng nó cũng sẽ tải các giá trị từ vị trí đầu tiên. Điều này hiển thị như một cảnh báo rằng các giá trị cấu hình xung đột khi cố gắng sử dụng 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"

(Lưu ý: đây cũng có thể là tình huống mà các cảnh báo LFS quá quyết đoán, # 861 )


Điều này rất hữu ích. Sẽ không bao giờ tìm thấy tệp đó ở Tất cả người dùng. Bạn đã làm gì với nó?
T3rm1

1
Tôi đã xóa các thư mục 'Git' khỏi C: \ Users \ All Users \ (một bí danh của C: \ ProgramData) và C: \ Users \ foo \ AppData \ Local \ Programs \ đã xóa tất cả các tệp cấu hình còn lại.
jinxcat2008

3

Bạn có thể sử dụng --show-originđể tìm ra các cấu hình đến từ đâu.

Ưu tiên tệp cấu hình trong Git cho Windows:

...

$PROGRAMDATA/Git/config::
(Chỉ dành cho Windows) Tệp cấu hình toàn hệ thống được chia sẻ với các triển khai Git khác. Thông thường $PROGRAMDATA chỉ đến C:\ProgramData.

$(prefix)/etc/gitconfig::
Tệp cấu hình toàn hệ thống. (Chỉ dành cho Windows) Tệp này chỉ chứa các cài đặt dành riêng cho cài đặt Git dành cho Windows này và không được chia sẻ với các cài đặt Git khác như JGit, libgit2. --systemsẽ chọn tệp này.

$XDG_CONFIG_HOME/git/config::
Tệp cấu hình dành riêng cho người dùng thứ hai. Nếu $XDG_CONFIG_HOMEkhông được đặt hoặc trống, $HOME/.config/git/configsẽ được sử dụng. Bất kỳ biến có giá trị đơn nào được đặt trong tệp này sẽ bị ghi đè bởi bất kỳ biến nào có trong đó ~/.gitconfig. Bạn không nên tạo tệp này nếu đôi khi bạn sử dụng các phiên bản Git cũ hơn, vì hỗ trợ cho tệp này đã được bổ sung gần đây.

~/.gitconfig::
Tệp cấu hình dành riêng cho người dùng. Còn được gọi là tệp cấu hình "toàn cầu".

$GIT_DIR/config::
Tệp cấu hình cụ thể của kho lưu trữ.

...

Các tệp được đọc theo thứ tự đã cho ở trên, với giá trị cuối cùng được tìm thấy được ưu tiên hơn các giá trị đã đọc trước đó.

...

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

$PROGRAMDATAlà một biến môi trường. Bạn có thể lấy giá trị của các biến đó như sau:

Trong Git Bash bạn cần sử dụng echo "$ProgramData". Trong CMD, bạn cần sử dụng echo %PROGRAMDATA%. Lưu ý rằng Git Bash dường như giả vờ rằng các biến môi trường phân biệt chữ hoa chữ thường.

$(prefix)gì?

Tiền tố là thư mục cấp cao nhất để cài đặt mọi thứ. Trong Git cho Windows, đó là <some-path>/mingw64hoặc <some-path>/mingw32.


3

git config -l hiển thị tất cả các giá trị kế thừa từ hệ thống, toàn cầu và cục bộ.

Vì vậy, bạn có một tệp cấu hình khác đang được tải cùng với .gitconfigtệp do người dùng xác định của bạn .


Cảm ơn, câu trả lời của bạn đã giúp tôi hiểu sự khác biệt giữa hệ thống và toàn cầu. Câu trả lời của @ Cupcake với cờ --system đã giúp tôi tìm thấy tệp.
RyanW

2

Câu trả lời hoàn chỉnh cho Windows (tức là phiên bản Windows của câu trả lời được chấp nhận):

Giống như Linux, Windows có bốn cấp độ tệp cấu hình / cài đặt và ba cấp độ tương đương trực tiếp. Điều quan trọng cần lưu ý là cái còn lại - 'Tất cả ứng dụng / Người dùng' - đặc biệt vì đây là nơi trình cài đặt đặt các giá trị, ví dụ: 'core.autocrlf = true', nhưng nó không thể được truy cập từ dòng lệnh vì vậy nó gây ra sự nhầm lẫn.

Tất cả các ứng dụng và người dùng

Đây giống như một phiên bản chia sẻ của cài đặt 'hệ thống' trong trường hợp bạn đã cài đặt nhiều ứng dụng Git. Không có lệnh 'git config' để truy cập những thứ này, nhưng chúng vẫn ảnh hưởng đến kết quả thực cho một cài đặt.

Vị trí tệp cấu hình:

C: \ ProgramData \ Git \ config

(Lưu ý rằng 'Dữ liệu Chương trình' là 'Tất cả Người dùng' trên các phiên bản Windows cũ hơn.)

Hệ thống

Vị trí tệp cấu hình: C: / Program Files / Git / mingw64 / etc / gitconfig

$ git config --system --list

Người dùng

Vị trí tệp cấu hình:% USERPROFILE% .gitconfig (Điều này giải quyết thành 'C: / Users / <tên người dùng>')

$ git config --global --list

Kho

Vị trí tệp cấu hình: [thư mục kho lưu trữ hiện tại] /. Git / config

$ git config --local --list

1

Trên Windows 7 (có thể giống hoặc tương tự đối với Windows 10), đối với Visual Studio và dòng lệnh Git, cấu hình chung của bạn nằm trong:

%USERPROFILE%\.gitconfig

(dấu chấm ở phía trước tên tệp)

Nhưng điều này không được Sourcetree tôn trọng, ít nhất là ở chế độ Nhúng Git và cấu hình ở:

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

(không có dấu chấm phía trước tên tệp)

(Tôi cần cập nhật cả hai tệp để sửa đổi cài đặt Git chung của mình cho lệnh Git và Sourcetree.)

Một phần thú vị khác. Cấu hình Git hooks đã hoạt động từ AppData\Local\...vị trí, nhưng sau khi nghiên cứu thêm thông qua Process Monitor , tôi nhận thấy bằng cách nào đó Sourcetree cũng đang tải toàn cầu từ ổ đĩa được ánh xạ của công ty cho người dùng của tôi.

Điều này rất có ý nghĩa vì rất ít ứng dụng tra cứu vị trí này, nhưng bằng cách nào đó Sourcetree lại làm được, vì vậy nếu bạn không thể làm cho nó hoạt động theo cài đặt vị trí tại Sourcetree, hãy chạy Process Monitor và tạo quy tắc chỉ ghi lại đường dẫn chứa gitconfig, còn bạn có thể tìm thấy thực sự cấu hình chung của bạn ở đâu trong trường hợp thư mục người dùng được ánh xạ mạng.

Và đây có thể không phải là lỗi của Sourcetree, vì tôi thấy bây giờ khi tôi viết cái này rằng git.exe đang tải cái đó, nhưng điều này chỉ xảy ra đối với git.exe được thực thi bởi Sourcetree, trong khi dòng lệnh trực tiếp Git sử dụng %USERPROFILE%\.gitconfig

Nhập mô tả hình ảnh tại đây

Cuối cùng, tôi lấy tất cả kết quả từ Process Monitor, đưa nó vào SQL Server và chạy một truy vấn để nhận được các kết quả khác biệt (không có thứ tự thực thi cụ thể nào chỉ được sắp xếp theo đường dẫn):

Nhập mô tả hình ảnh tại đây

Tôi không biết các cấu hình đó liên quan với nhau như thế nào, nhưng tôi biết một số ghi đè một số cài đặt khác hoạt động từ một vị trí một số cài đặt khác.

Và danh sách trên được gọi bởi Sourcetree , một lần nữa hướng một dòng lệnh với Git dường như hoạt động tốt %USERPROFILE%\.gitconfigvà điều đó không có trong danh sách này, nhưng nó sẽ giống như thế này (trên Windows 7)C:\Users\pawel.cioch\.gitconfig


1

Ngoài ra git config -l --show-origin, tôi đã trình bày ở đây , với git 2,8 (tháng 3 năm 2016), bây giờ bạn có, với Git 2,26 (quý 1 năm 2020)

git config -l --show-scope

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

git configđã học cách hiển thị trong đó " scope", ngoài tệp, mỗi cài đặt cấu hình đến từ.

Xem cam kết 145d59f , cam kết 9a83d08 , cam kết e37efa4 , cam kết 5c105a8 , cam kết 6766e41 , cam kết 6dc905d , cam kết a5cb420 (10 tháng 2 năm 2020) và cam kết 417be08 , cam kết 3de7ee3 , cam kết 329e6ec (24 tháng 1 năm 2020) bởi Matthew Rogers ( ROGERSM94) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster- trong cam kết 5d55554 , ngày 17 tháng 2 năm 2020)

config: add '--show-scope' để in phạm vi của giá trị cấu hình

Ký tên: Matthew Rogers

Khi một truy vấn người dùng cấu hình các giá trị với --show-origin, thường rất khó để xác định những gì thực tế " scope" ( local, global, vv) của một giá trị nhất định dựa trên chỉ là tập tin gốc.

Dạy --show-scopetùy chọn 'git config' để in phạm vi của tất cả các giá trị cấu hình được hiển thị.

Lưu ý rằng chúng ta sẽ không bao giờ thấy bất kỳ thứ gì thuộc phạm vi "submodule" vì nó chỉ được sử dụng submodule-config.ckhi phân tích cú pháp tệp '.gitmodules'.

Thí dụ:

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

-1

Nếu bạn muốn tìm để tìm vị trí tệp thực, nó sẽ nằm trong thư mục chính của bạn.

Nó được ẩn và đứng trước dấu ".".

Vì vậy, nếu bạn đang sử dụng máy Mac, trong thiết bị đầu cuối của bạn, bạn có thể cd ~ && open .gitconfighoặc mở nó bằng trình soạn thảo văn bản yêu thích của bạn, ví dụ cd ~ && atom .gitconfig.


1
Điều này đã được nói. Không cần thêm sự nhầm lẫn bằng cách đề xuất một giải pháp thay thế (không phải).
Kích thích
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.