Dari mana asal pengaturan dalam konfigurasi Git saya?

88

Saya perhatikan bahwa saya memiliki dua daftar untuk core.autocrlfsaat saya menjalankangit 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
[email protected]
core.autocrlf=true

Tiga yang terakhir (dari user.name ke bawah) adalah satu-satunya yang ada di C:\users\username\.gitconfigfile saya . Dari mana semua yang lainnya berasal? Mengapa core.autocrlf terdaftar dua kali?

Ini dengan MSysGit 1.8.3, dan saya juga telah menginstal Sourcetree (Windows 7). Di Sourcetree saya telah menghapus centang pada "Izinkan Sourcetree untuk mengubah file konfigurasi Git global Anda"

RyanW
sumber
18
Catatan: dengan git 2.8 (Maret 2016) dan git config --list --show-origin, Anda tidak perlu menebak konfigurasi git mana. Lihat jawaban saya di bawah ini
VonC

Jawaban:

97

Git memeriksa empat tempat untuk file konfigurasi:

  1. .gitconfigFile sistem mesin Anda .
  2. .gitconfigFile pengguna Anda terletak di ~/.gitconfig.
  3. File konfigurasi khusus pengguna kedua terletak di $XDG_CONFIG_HOME/git/configatau $HOME/.config/git/config.
  4. File konfigurasi repositori lokal .git/config.

Pengaturan bertingkat dalam urutan berikut, dengan setiap file menambahkan atau mengganti pengaturan yang ditentukan dalam file di atasnya.

  1. Sistem konfigurasi.
  2. Konfigurasi pengguna.
  3. Konfigurasi khusus repositori.

Anda dapat melihat apa yang telah ditentukan setiap file menggunakan perintah berikut:

# 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

Anda dapat melihat apa yang baru saja didefinisikan oleh file khusus repositori dengan membuka file .git/configuntuk repositori itu.

Jika Anda menggunakan MSysGit di Windows, Anda mungkin akan menemukan ~/.gitconfigfile pengguna Anda di mana pun %homepath%jika Anda menggunakan echo %homepath%dari prompt perintah Windows.

Dari dokumentasi untukgit config :

Jika tidak diatur secara eksplisit dengan --file, ada empat file yang git configakan mencari opsi konfigurasi:

  • $(prefix)/etc/gitconfig

    File konfigurasi seluruh sistem.

  • $XDG_CONFIG_HOME/git/config

File konfigurasi khusus pengguna kedua. Jika $XDG_CONFIG_HOMEtidak disetel atau kosong, $HOME/.config/git/configakan digunakan. Setiap variabel bernilai tunggal yang ditetapkan dalam file ini akan ditimpa oleh apa pun yang ada di ~/.gitconfig. Sebaiknya jangan membuat file ini jika Anda terkadang menggunakan Git versi lama, karena dukungan untuk file ini baru saja ditambahkan.

  • ~/.gitconfig

File konfigurasi khusus pengguna. Juga disebut file konfigurasi "global".

  • $GIT_DIR/config

    File konfigurasi khusus repositori.

Jika tidak ada opsi lebih lanjut yang diberikan, semua opsi membaca akan membaca semua file yang tersedia ini. Jika file konfigurasi global atau seluruh sistem tidak tersedia, file tersebut akan diabaikan. Jika file konfigurasi repositori tidak tersedia atau dapat dibaca, git configakan keluar dengan kode kesalahan bukan nol. Namun, dalam kedua kasus tersebut pesan kesalahan tidak akan dikeluarkan.

File-file tersebut dibaca dalam urutan yang diberikan di atas, dengan nilai terakhir yang didahulukan daripada nilai yang telah dibaca sebelumnya. Ketika beberapa nilai diambil maka semua nilai kunci dari semua file akan digunakan.

Semua opsi penulisan akan secara default menulis ke file konfigurasi khusus repositori. Perhatikan bahwa ini juga memengaruhi opsi seperti --replace-alldan --unset. git config hanya akan mengubah satu file dalam satu waktu.

Anda dapat mengganti aturan ini baik dengan opsi baris perintah atau dengan variabel lingkungan. Opsi --globaldan --systemakan membatasi file yang digunakan untuk file global atau seluruh sistem. The GIT_CONFIGvariabel lingkungan memiliki efek yang sama, tetapi Anda dapat menentukan nama file yang Anda inginkan.

Peter Mortensen
sumber
3
Di mana " .gitconfigfile sistem mesin " saat di Windows dengan msysgit?
DanielSank
3
@DanielScoba C:\Program Files (x86)\Git\etc\gitconfig. Tidak yakin apakah itu yang benar.
@Cupcake: Ya, itu dia. Untuk beberapa alasan saya tidak dapat mengubah file itu. Beberapa proses menahannya ... tidak dapat menemukan yang mana. Saya kira itu tidak masalah karena saya bisa mengganti di konfigurasi tingkat pengguna. Terima kasih.
DanielSank
2
Git saat ini berbunyiC:\Program Files\Git\mingw64\etc\gitconfig
Kevin Smyth
1
@Kevin ini berubah baru-baru ini menjadiC:\Program Files\Git\etc\gitconfig
Enrice
63

Anda tidak perlu lagi menebak-nebak konfigurasi mana yang telah disetel ke mana, dengan git 2.8! (Maret 2016)

Lihat commit 70bd879 , commit 473166b , commit 7454ee3 , commit 7454ee3 (19 Feb 2016), commit 473166b , commit 7454ee3 (19 Feb 2016), commit 7454ee3 (19 Feb 2016), dan commit a0578e0 (17 Feb 2016) oleh Lars Schneider ( larsxschneider) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit dd0f567 , 26 Feb 2016)

config: add ' --show-origin' opsi untuk mencetak asal dari nilai config

Jika nilai-nilai config yang bertanya menggunakan ' git config' (misalnya melalui --get, --get-all, --get-regexp, atau --listbendera) maka kadang-kadang sulit untuk menemukan file konfigurasi di mana nilai-nilai yang ditetapkan.

Ajarkan opsi ' git config' the ' --show-origin' untuk mencetak file konfigurasi sumber untuk setiap nilai yang dicetak.

The git confighalaman manual sekarang akan menunjukkan:

--show-origin:

Tambahkan output dari semua opsi konfigurasi yang ditanyakan dengan tipe asal (file, input standar, blob, baris perintah) dan asal sebenarnya (jalur file config, ref, atau id blob jika ada).

Sebagai contoh:

git config --list --show-origin

Itu akan menghasilkan:

    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

Untuk satu pengaturan, seperti yang dikomentari oleh wisbucky :

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

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

Dengan Git 2.26 (Q1 2020), Anda dapat menambahkan --show-scopeopsi :

git config -l --show-origin --show-scope
VonC
sumber
1
Terima kasih Tuhan. Begitu banyak artikel online yang berbeda menebak di mana konfigurasi git mungkin disimpan. Semua artikel melewatkan satu kemungkinan lokasi yang kebetulan disetel di mesin saya: c: \ programdata \ git \ config. Tidak tahu mengapa itu ada di sana, tetapi saya menduga integrasi TFS Visual Studio. Lokasi aneh lain yang terlalu banyak saya habiskan untuk mencari adalah: C: \ program files \ mingw64 \ etc \ .gitconfig dan H: \. Gitconfig. Terima kasih Tuhan untuk perintah baru ini. Yesus. Kristus.
RMuesi
Saya bertanya-tanya mengapa user.cmdline=truediperlukan untuk --show-originbekerja? Juga, saya perhatikan bahwa --show-originperlu segera setelah configuntuk bekerja dengan --getdan --get-all. Jadi seharusnya... config --show-origin --get-all core.autocrlf
beruntung
@wisbucky Setuju: Saya menghapus -c 'user.cmdline=true'bit, yang tampaknya mengacu pada cakupan pengujian: github.com/git/git/blob/…
VonC
@wisbucky Dan saya telah memasukkan contoh Anda untuk satu pengaturan.
VonC
@VonC, Ah sepertinya user.cmdline=truediperlukan di Git 2.13, tetapi tidak lagi diperlukan di Git 2.15.
wisbucky
10

Setelah sebelumnya menginstal Git untuk Windows dan kemudian menghapusnya, saya menemukan bahwa ada file konfigurasi yang diinstal C:\Users\All Users\Git\configyang merupakan file konfigurasi tingkat sistem yang tetap ada dan akan memengaruhi paket MinGW32 Git di masa mendatang (dalam kasus saya, saya menjalankan MinGW32 portabel Paket Git disediakan oleh perusahaan saya). Saat aku lari

git config --system --edit

itu akan menunjukkan kepada saya file konfigurasi sistem yang terletak di mingw32/etc/gitconfig, tetapi masih akan memuat nilai-nilai dari lokasi pertama juga. Ini muncul sebagai peringatan bahwa nilai konfigurasi bentrok saat mencoba menggunakan 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"

(Catatan: ini mungkin juga merupakan situasi di mana peringatan LFS terlalu tegas, # 861 )

jinxcat2008
sumber
Ini sangat berguna. Tidak akan pernah menemukan file itu di Semua Pengguna. Apa yang kamu lakukan dengannya?
T3rm1
1
Saya menghapus folder 'Git' dari C: \ Users \ All Users \ (alias untuk C: \ ProgramData) dan C: \ Users \ foo \ AppData \ Local \ Programs \ yang menghapus semua file konfigurasi yang tersisa.
jinxcat2008
3

Anda dapat menggunakan --show-originuntuk mengetahui dari mana konfigurasi itu berasal.

Prioritas file konfigurasi di Git untuk Windows:

...

$PROGRAMDATA/Git/config::
(khusus Windows) File konfigurasi seluruh sistem yang dibagikan dengan implementasi Git lainnya. Biasanya $PROGRAMDATA menunjuk ke C:\ProgramData.

$(prefix)/etc/gitconfig::
File konfigurasi seluruh sistem. (Khusus Windows) File ini hanya berisi pengaturan khusus untuk instalasi Git untuk Windows ini dan yang tidak boleh digunakan bersama dengan implementasi Git lainnya seperti JGit, libgit2. --systemakan memilih file ini.

$XDG_CONFIG_HOME/git/config::
File konfigurasi khusus pengguna kedua. Jika $XDG_CONFIG_HOMEtidak disetel atau kosong, $HOME/.config/git/configakan digunakan. Setiap variabel bernilai tunggal yang ditetapkan dalam file ini akan ditimpa oleh apa pun yang ada di ~/.gitconfig. Sebaiknya jangan membuat file ini jika Anda terkadang menggunakan Git versi lama, karena dukungan untuk file ini baru saja ditambahkan.

~/.gitconfig::
File konfigurasi khusus pengguna. Juga disebut file konfigurasi "global".

$GIT_DIR/config::
File konfigurasi khusus repositori.

...

File-file tersebut dibaca dalam urutan yang diberikan di atas, dengan nilai terakhir yang didahulukan daripada nilai yang telah dibaca sebelumnya.

...

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

$PROGRAMDATAadalah variabel lingkungan. Anda bisa mendapatkan nilai variabel tersebut seperti ini:

Di Git Bash Anda perlu menggunakan echo "$ProgramData". Di CMD, Anda perlu menggunakan echo %PROGRAMDATA%. Perhatikan bahwa Git Bash tampaknya berpura-pura bahwa variabel lingkungan peka huruf besar kecil.

Apa $(prefix)?

Awalan adalah direktori tingkat atas tempat hal-hal diinstal. Di Git untuk Windows, itu adalah <some-path>/mingw64atau <some-path>/mingw32.

Ini
sumber
3

git config -l menunjukkan semua nilai yang diwarisi dari sistem, global, dan lokal.

Jadi, Anda memiliki file konfigurasi lain di suatu tempat yang sedang dimuat bersama dengan .gitconfigfile yang ditentukan pengguna Anda .

CBIII
sumber
Terima kasih, jawaban Anda memberi petunjuk kepada saya tentang perbedaan antara sistem dan global. @ Jawaban Cupcake dengan flag --system membantu saya menemukan file tersebut.
RyanW
2

Jawaban lengkap untuk Windows (yaitu versi Windows dari jawaban yang diterima):

Seperti Linux, Windows memiliki empat tingkat file konfigurasi / pengaturan dan tiga yang setara langsung. Hal penting untuk diperhatikan adalah yang lain - yang 'Semua Aplikasi / Pengguna' - terutama karena di sinilah penginstal menetapkan nilai, misalnya 'core.autocrlf = true', namun tidak dapat diakses dari baris perintah sehingga menyebabkan kebingungan.

Semua Aplikasi dan Pengguna

Ini seperti versi bersama dari pengaturan 'sistem' jika Anda memiliki beberapa aplikasi Git yang diinstal. Tidak ada perintah 'git config' untuk mengaksesnya, tetapi perintah tersebut masih memengaruhi hasil bersih untuk suatu pengaturan.

Lokasi file konfigurasi:

C: \ ProgramData \ Git \ config

(Perhatikan bahwa 'ProgramData' adalah 'Semua Pengguna' di versi Windows yang lebih lama.)

Sistem

Lokasi file konfigurasi: C: / Program Files / Git / mingw64 / etc / gitconfig

$ git config --system --list

Pengguna

Lokasi file konfigurasi:% USERPROFILE% .gitconfig (Ini memutuskan 'C: / Users / <username>')

$ git config --global --list

Gudang

Lokasi file konfigurasi: [direktori repositori saat ini] /. Git / config

$ git config --local --list
Tom
sumber
2

Selain itu git config -l --show-origin, yang saya sajikan di sini , dengan git 2.8 (Maret 2016), Anda sekarang memiliki, dengan Git 2.26 (Q1 2020)

git config -l --show-scope

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

git configbelajar untuk menunjukkan dari mana " scope", selain dari file mana, setiap pengaturan konfigurasi berasal.

Lihat commit 145d59f , commit 9a83d08 , commit e37efa4 , commit 5c105a8 , commit 6766e41 , commit 6dc905d , commit a5cb420 (10 Feb 2020), dan commit 417be08 , commit 3de7ee3 , commit 329e6ec (24 Jan 2020) by Matthew Rogers ( ROGERSM94) .
(Digabung oleh Junio ​​C Hamano - gitster- di commit 5d55554 , 17 Feb 2020)

config: tambahkan '--show-scope' untuk mencetak lingkup nilai konfigurasi

Ditandatangani oleh: Matthew Rogers

Ketika permintaan pengguna konfigurasi nilai-nilai dengan --show-origin, sering sulit untuk menentukan apa yang sebenarnya " scope" ( local, global, dll) dari nilai yang diberikan didasarkan pada hanya file asal.

Ajarkan --show-scopeopsi 'git config' the ' ' untuk mencetak cakupan semua nilai konfigurasi yang ditampilkan.

Perhatikan bahwa kita tidak boleh melihat apa pun dari lingkup "submodule" karena itu hanya pernah digunakan oleh submodule-config.csaat mengurai file '.gitmodules'.

Contoh:

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
VonC
sumber
1

Di Windows 7 (mungkin sama atau serupa untuk Windows 10), untuk Visual Studio dan baris perintah Git, konfigurasi global Anda ada di:

%USERPROFILE%\.gitconfig

(titik di depan nama file)

Tapi ini tidak diterima oleh Sourcetree, setidaknya dalam mode Git Embedded, dan konfigurasinya ada di:

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

(tidak ada titik di depan nama file)

(Saya perlu memperbarui kedua file untuk mengubah pengaturan Git global saya untuk perintah Git dan Sourcetree.)

Bagian menyenangkan lainnya. Konfigurasi Git hooks bekerja dari AppData\Local\...lokasi, tetapi setelah penelitian lebih lanjut melalui Process Monitor , saya perhatikan entah bagaimana Sourcetree juga memuat global dari drive yang dipetakan perusahaan untuk pengguna saya.

Ini sangat tidak masuk akal karena sangat sedikit aplikasi yang mencari lokasi ini, tetapi entah bagaimana Sourcetree melakukannya, jadi jika Anda tidak dapat membuatnya bekerja per pengaturan lokasi di Sourcetree, jalankan Monitor Proses dan buat aturan untuk hanya mencatat jalur yang berisi gitconfig, dan Anda dapat menemukan di mana sebenarnya konfigurasi global Anda dalam kasus direktori pengguna yang dipetakan jaringan.

Dan ini bahkan mungkin bukan kesalahan Sourcetree, seperti yang saya lihat sekarang ketika saya menulis ini bahwa git.exe memuat itu, tetapi ini hanya terjadi untuk git.exe yang dieksekusi oleh Sourcetree, sementara baris perintah langsung yang digunakan Git %USERPROFILE%\.gitconfig

Masukkan deskripsi gambar di sini

Akhirnya saya mengambil semua hasil dari Monitor Proses, memasukkannya ke SQL Server dan menjalankan kueri untuk mendapatkan hasil yang berbeda (tidak ada urutan eksekusi tertentu yang hanya diurutkan berdasarkan jalur):

Masukkan deskripsi gambar di sini

Saya tidak tahu bagaimana konfigurasi tersebut berhubungan satu sama lain, tetapi saya tahu beberapa menimpa yang lain beberapa pengaturan berfungsi dari satu lokasi beberapa dari yang lain.

Dan daftar di atas dipanggil oleh Sourcetree , sekali lagi mengarahkan baris perintah dengan Git tampaknya berfungsi dengan baik %USERPROFILE%\.gitconfig, dan itu tidak ada dalam daftar ini, tetapi akan terlihat seperti ini (di Windows 7)C:\Users\pawel.cioch\.gitconfig

Pawel Cioch
sumber
-1

Jika Anda ingin mencari lokasi file sebenarnya, itu ada di direktori home Anda.

Itu tersembunyi dan didahului dengan ".".

Jadi, jika Anda menggunakan Mac, di terminal Anda, Anda dapat cd ~ && open .gitconfigatau membukanya dengan editor teks favorit Anda, mis cd ~ && atom .gitconfig.

AshNaz87
sumber
1
Ini sudah dikatakan. Tidak perlu menambah kebingungan dengan menyarankan alternatif (non).
Stim