Git yapılandırmamdaki ayarlar nereden geliyor?


88

core.autocrlfÇalıştırdığım zaman için iki listem olduğunu fark ettimgit 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

Son üçü (user.name'den aşağı) benim C:\users\username\.gitconfig . Diğerlerinin hepsi nereden geliyor? Core.autocrlf neden iki kez listeleniyor?

Bu MSysGit 1.8.3 ile ve ayrıca Sourcetree yüklü (Windows 7). Sourcetree'de "Sourcetree'nin genel Git yapılandırma dosyalarınızı değiştirmesine izin ver" seçeneğinin işaretini kaldırdım.


18
Not: git 2.8 (Mart 2016) ile ve git config --list --show-originhangi git yapılandırmasının nerede olduğunu tahmin etmenize gerek kalmayacak. Aşağıdaki cevabımı
VonC

Yanıtlar:


97

Git, bir yapılandırma dosyası için dört yeri kontrol eder:

  1. Makinenizin sistem .gitconfigdosyası.
  2. Kullanıcı .gitconfigdosyanızın bulunduğu yer ~/.gitconfig.
  3. $XDG_CONFIG_HOME/git/configVeya konumunda bulunan ikinci bir kullanıcıya özgü yapılandırma dosyası $HOME/.config/git/config.
  4. Yerel deponun yapılandırma dosyası .git/config.

Ayarlar, her dosya üstündeki dosyada tanımlanan ayarları ekleyerek veya geçersiz kılarak aşağıdaki sırada basamaklanır.

  1. Sistem yapılandırması.
  2. Kullanıcı Yapılandırması.
  3. Depoya özel yapılandırma.

Aşağıdaki komutları kullanarak her dosyanın neyi tanımladığını görebilirsiniz:

# 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

Depoya özgü dosyanın ne tanımladığını .git/config, o arşiv için dosyayı açarak görebilirsiniz .

Windows'ta MSysGit kullanıyorsanız, muhtemelen bir Windows komut isteminden kullanıyorsanız , kullanıcı ~/.gitconfigdosyanızı %homepath%işaret ettiği yerde bulacaksınız echo %homepath%.

Gönderen belgelerinegit config :

Açık olarak ayarlanmadıysa --file, git configyapılandırma seçeneklerini arayacak dört dosya vardır :

  • $(prefix)/etc/gitconfig

    Sistem genelinde yapılandırma dosyası.

  • $XDG_CONFIG_HOME/git/config

İkinci kullanıcıya özgü yapılandırma dosyası. Eğer $XDG_CONFIG_HOMEayarlamak veya boş değil, $HOME/.config/git/configkullanılacaktır. Bu dosyadaki herhangi bir tek değerli değişken, içinde ne varsa üzerine yazılacaktır ~/.gitconfig. Bazen Git'in eski sürümlerini kullanıyorsanız, bu dosya için destek oldukça yakın zamanda eklendiğinden, bu dosyayı oluşturmamak iyi bir fikirdir.

  • ~/.gitconfig

Kullanıcıya özel yapılandırma dosyası. "Global" yapılandırma dosyası olarak da adlandırılır.

  • $GIT_DIR/config

    Depoya özel yapılandırma dosyası.

Başka seçenek belirtilmezse, tüm okuma seçenekleri mevcut olan tüm bu dosyaları okuyacaktır. Genel veya sistem çapında yapılandırma dosyası mevcut değilse, bunlar göz ardı edilecektir. Depo yapılandırma dosyası mevcut değilse veya okunamıyorsa,git config sıfır olmayan bir hata koduyla çıkar. Ancak her iki durumda da bir hata mesajı verilmez.

Dosyalar yukarıda verilen sırayla okunur ve bulunan son değer daha önce okunan değerlere göre önceliklidir. Birden fazla değer alındığında, tüm dosyalardan bir anahtarın tüm değerleri kullanılacaktır.

Tüm yazma seçenekleri varsayılan olarak havuza özel yapılandırma dosyasına yazılır. Bunun ayrıca --replace-allve gibi seçenekleri de etkilediğini unutmayın --unset. git config her seferinde yalnızca bir dosyayı değiştirir.

Bu kuralları, komut satırı seçenekleriyle veya ortam değişkenleriyle geçersiz kılabilirsiniz. --globalVe --systemseçenekleri sırasıyla global veya sistem genelinde dosyaya kullanılan dosyayı sınırlandırır. GIT_CONFIGOrtam değişkeni de benzer bir etkiye sahiptir, ancak istediğiniz herhangi bir dosya adı belirtebilirsiniz.


3
.gitconfigMsysgit ile Windows'dayken "makinenin sistem dosyası" nerede?
DanielSank

3
@DanielSank deneyin C:\Program Files (x86)\Git\etc\gitconfig. Doğru olanın bu olduğundan emin değilim.

@Cupcake: Evet, buydu. Bazı nedenlerden dolayı bu dosyayı değiştiremiyorum. Bazı süreçler onu tutuyor ... hangisi olduğunu anlayamıyorum. Sanırım kullanıcı seviyesindeki yapılandırmaları geçersiz kılabildiğim için önemli değil. Teşekkürler.
DanielSank

2
Şu anki Git okurC:\Program Files\Git\mingw64\etc\gitconfig
Kevin Smyth

1
@KevinSmyth bu kısa süre önce şu şekilde değiştiC:\Program Files\Git\etc\gitconfig
Enrice

63

Git 2.8 ile artık hangi yapılandırmanın nereye ayarlandığını tahmin etmenize gerek yok! (Mart 2016)

Bakın 70 Александ79 , commit 473166b , commit 7454ee3 , commit 7454ee3 (19 Feb 2016), commit 473166b , commit 7454ee3 (19 Feb 2016), commit 7454ee3 (19 Feb 2016), and commit a0578e0 (17 Feb 2016) by Lars Schneider ( larsxschneider) .
( Junio ​​C Hamano ile birleştirildi - gitster- in commit dd0f567 , 26 Şub 2016)

config: --show-originbir yapılandırma değerinin kaynağını yazdırmak için ' ' ekle seçeneği

Yapılandırma değerleri 'kullanılarak sorgulanan ise git config(örneğin aracılığıyla' --get, --get-all, --get-regexp, veya--list bayrak) o zaman değerleri tanımlandı yapılandırma dosyasını bulmak bazen zor.

Yazdırılan her değer için kaynak yapılandırma dosyasını yazdırmayı git config' --show-origin' ' ' seçeneğini öğretin .

git configAdam sayfası şimdi gösterir olacaktır:

--show-origin:

Tüm sorgulanan yapılandırma seçeneklerinin çıktısını kaynak türü (dosya, standart giriş, blob, komut satırı) ve gerçek kaynak (varsa yapılandırma dosyası yolu, ref veya blob kimliği) ile artırın.

Örneğin:

git config --list --show-origin

Geri dönecek:

    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

Bir ayar için, olarak yorumladı tarafından 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 (Q1 2020) ile şu --show-scopeseçeneği ekleyebilirsiniz :

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

1
tanrıya şükür. Git yapılandırmalarının nerede saklanmış olabileceğini tahmin eden pek çok farklı makale çevrimiçi. Tüm makaleler makinemde ayarlanan olası bir konumu gözden kaçırdı: c: \ programdata \ git \ config. Neden orada olduğunu bilmiyorum, ancak Visual Studio'nun TFS entegrasyonundan şüpheleniyorum. Çok fazla zaman harcadığım diğer garip yerler şunlardı: C: ​​\ program files \ mingw64 \ etc \ .gitconfig ve H: \. Gitconfig. Bu yeni komut için Tanrıya şükür. İsa. İsa.
RMuesi

Acaba çalışmak user.cmdline=trueiçin neden gerekli --show-origin? Ayrıca, ve ile çalışmak --show-originiçin hemen sonra olması gerektiğini fark ettim . Öyleyse olmalıconfig--get--get-all... config --show-origin --get-all core.autocrlf
bilgece

@wisbucky Kabul Edildi: -c 'user.cmdline=true'Test kapsamına atıfta bulunuyor gibi görünen biti kaldırıyorum
VonC

@wisbucky Ve bir ayar için örneğinizi ekledim.
VonC

@VonC, Ah user.cmdline=trueGit 2.13'te gerekli gibi görünüyor , ancak Git 2.15'te artık gerekli değil.
bilgece

10

Önceden kurduktan sonra Windows için Git'i ve ardından kaldırdıktan sonra, C:\Users\All Users\Git\configsistem düzeyinde bir yapılandırma dosyası olan ve gelecekteki MinGW32 Git paketlerini etkileyecek olan bir yapılandırma dosyasının kurulu olduğunu buldum (benim durumumda taşınabilir bir MinGW32 çalıştırıyordum. Şirketim tarafından sağlanan Git paketi). Koştuğumda

git config --system --edit

bana şu konumda bulunan sistem yapılandırma dosyasını gösterirdi mingw32/etc/gitconfig , ancak yine de değerleri ilk konumdan yüklerdi. Bu, Git LFS'yi kullanmaya çalışırken yapılandırma değerlerinin çakıştığına dair bir uyarı olarak ortaya çıktı .

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"

(Not: Bu aynı zamanda LFS uyarılarının çok iddialı olduğu bir durum olabilir, # 861 )


Bu çok kullanışlıdır. Bu dosyayı Tüm Kullanıcılar'da asla bulamazdım. Onunla ne yaptın?
T3rm1

1
'Git' klasörlerini C: \ Users \ All Users \ (C: \ ProgramData için takma ad) ve C: \ Users \ foo \ AppData \ Local \ Programs \ 'dan kaldırdım ve kalan tüm yapılandırma dosyalarını kaldırdım.
jinxcat2008

3

--show-originKonfigürasyonların nereden geldiğini öğrenmek için kullanabilirsiniz .

Windows için Git'te yapılandırma dosyaları önceliği:

...

$PROGRAMDATA/Git/config::
(yalnızca Windows) Diğer Git uygulamalarıyla paylaşılan sistem çapında yapılandırma dosyası. Genellikle $PROGRAMDATA işaret eder C:\ProgramData.

$(prefix)/etc/gitconfig::
Sistem genelinde yapılandırma dosyası. (Yalnızca Windows) Bu dosya yalnızca bu Windows için Git kurulumuna özgü ayarları içerir ve JGit, libgit2 gibi diğer Git uygulamalarıyla paylaşılmaması gereken ayarları içerir. --systembu dosyayı seçecek.

$XDG_CONFIG_HOME/git/config::
İkinci kullanıcıya özel konfigürasyon dosyası. Eğer $XDG_CONFIG_HOMEayarlamak veya boş değil, $HOME/.config/git/configkullanılacaktır. Bu dosyadaki herhangi bir tek değerli değişken, içinde ne varsa üzerine yazılacaktır ~/.gitconfig. Bazen Git'in eski sürümlerini kullanıyorsanız, bu dosya için destek oldukça yakın zamanda eklendiğinden, bu dosyayı oluşturmamak iyi bir fikirdir.

~/.gitconfig::
Kullanıcıya özel konfigürasyon dosyası. "Global" yapılandırma dosyası olarak da adlandırılır.

$GIT_DIR/config::
Depoya özel yapılandırma dosyası.

...

Dosyalar yukarıda verilen sırayla okunur ve bulunan son değer daha önce okunan değerlere göre önceliklidir.

...

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

$PROGRAMDATAbir ortam değişkenidir. Bu değişkenlerin değerini şu şekilde alabilirsiniz:

Git Bash'de kullanmanız gerekir echo "$ProgramData". CMD'de kullanmanız gerekir echo %PROGRAMDATA%. Git Bash'in görünüşe göre ortam değişkenlerinin büyük / küçük harfe duyarlı olduğunu varsaydığını unutmayın.

Nedir $(prefix)?

Önek, şeylerin kurulduğu en üst düzey dizindir. Windows için Git'te bu ya ya <some-path>/mingw64da <some-path>/mingw32.


3

git config -l sistem, global ve yerel tüm miras alınan değerleri gösterir.

Dolayısıyla, kullanıcı tanımlı .gitconfigdosyanızla birlikte bir yerde yüklenmekte olan başka bir yapılandırma dosyanız var .


Teşekkürler, cevabınız beni sistem ve küresel arasındaki fark konusunda ipucu verdi. @ Cupcake'in --sistem bayraklarıyla verdiği yanıt, dosyayı bulmama yardımcı oldu.
RyanW

2

Windows için tam bir cevap (yani kabul edilen cevabın Windows sürümü):

Linux gibi, Windows da dört düzeyde yapılandırma dosyası / ayarına sahiptir ve üçü doğrudan eşdeğerdir. Unutulmaması gereken önemli şey diğeridir - 'Tüm Uygulamalar / Kullanıcılar' - özellikle de yükleyicinin değerleri ayarladığı, örneğin 'core.autocrlf = true' olduğu ve yine de komut satırından erişilemediği için bu yüzden kafa karışıklığına neden olur.

Tüm Uygulamalar ve Kullanıcılar

Bu, birden fazla Git uygulamanızın kurulu olması durumunda 'sistem' ayarlarının paylaşılan bir sürümü gibidir. Bunlara erişmek için 'git config' komutu yoktur, ancak yine de bir ayar için net sonucu etkilerler.

Yapılandırma dosyası konumu:

C: \ ProgramData \ Git \ config

(Windows'un eski sürümlerinde 'ProgramData'nın' Tüm Kullanıcılar 'olduğunu unutmayın.)

Sistem

Yapılandırma dosyası konumu: C: / Program Dosyaları / Git / mingw64 / etc / gitconfig

$ git config --system --list

Kullanıcı

Yapılandırma dosyası konumu:% USERPROFILE% .gitconfig (Bu, 'C: / Kullanıcılar / <kullanıcı adı>' olarak çözülür)

$ git config --global --list

Depo

Yapılandırma dosyası konumu: [geçerli depo dizini] /. Git / config

$ git config --local --list

2

Ek olarak git config -l --show-originbu, burada sunulan Git 2.8 (2016 Mart) ile, artık Git 2,26 ile (Q1 2020), sahip

git config -l --show-scope

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

git configscopeher yapılandırma ayarının hangi dosyaya ek olarak hangi " " içinden geldiğini göstermeyi öğrendi .

Bkz 145d59f işlemek , 9a83d08 işlemek , e37efa4 işlemek , 5c105a8 işlemek , 6766e41 işlemek , 6dc905d işlemek , a5cb420 tamamlama (muhtemelen 2020 10 Şubat) ve 417be08 işlemek , 3de7ee3 işlemek , 329e6ec tamamlama ile (muhtemelen 2020 24 Ara) Matthew Rogers ( ROGERSM94) .
( Junio ​​C Hamanogitster tarafından birleştirildi - - in commit 5d55554 , 17 Şub 2020)

config: bir yapılandırma değerinin kapsamını yazdırmak için '--show-kapsam' ekleyin

İmza: Matthew Rogers

Bir kullanıcı yapılandırma değerlerini sorguladığında --show-origin, genellikle gerçek " scope" ( local,global belirli bir değerin, vs.) sadece köken dosyası dayanmaktadır.

'Git config'i' öğretin--show-scopeGörüntülenen tüm yapılandırma değerlerinin kapsamını yazdırmak için 'seçeneğini .

Yalnızca submodule-config.c".gitmodules" dosyası ayrıştırılırken kullanıldığı için "alt modül" kapsamından hiçbir şey görmememiz gerektiğini unutmayın.

Misal:

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

Windows 7'de (Windows 10 için aynı veya benzer olabilir), Visual Studio ve Git komut satırı için genel yapılandırmanız şu konumdadır:

%USERPROFILE%\.gitconfig

(nokta dosya adının önündedir)

Ancak bu Sourcetree tarafından, en azından Git Gömülü modunda kabul edilmiyor ve yapılandırma şu şekilde:

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

(dosya adının önünde nokta yok)

(Git komutu ve Sourcetree için genel Git ayarlarımı değiştirmek için her iki dosyayı da güncellemem gerekiyordu.)

Başka bir eğlenceli kısım. Git kancaları yapılandırması AppData\Local\...konumdan çalışıyordu , ancak daha fazla araştırmadan sonra Process Monitor , bir şekilde Sourcetree'nin kullanıcım için şirket haritalı sürücüden global olarak yüklendiğini fark ettim.

Bu, çok az uygulama bu konumu aradığından çok az anlam ifade eder, ancak bir şekilde Sourcetree yapar, bu nedenle Sourcetree'deki konum ayarlarına göre çalışmasını sağlayamazsanız, Process Monitor'ü çalıştırın ve yalnızca gitconfig içeren yolu günlüğe kaydetmek için bir kural oluşturun. ağ eşlemeli bir kullanıcı dizini durumunda genel yapılandırmanızın nerede olduğunu bulabilir.

Ve bu Sourcetree'nin hatası bile olmayabilir, çünkü şimdi bunu yazarken git.exe'nin bunu yüklediğini görüyorum, ancak bu yalnızca Sourcetree tarafından yürütülen git.exe için olurken, Git doğrudan komut satırı %USERPROFILE%\.gitconfig

Buraya resim açıklamasını girin

Sonunda Process Monitor'den tüm sonuçları aldım, SQL Server'a aktardım ve farklı sonuçlar elde etmek için bir sorgu çalıştırdım (sadece yola göre sıralanan belirli bir yürütme sırası yok):

Buraya resim açıklamasını girin

Bu konfigürasyonların birbirleriyle nasıl ilişkili olduğunu bilmiyorum, ancak bazılarının bir diğerini geçersiz kıldığını biliyorum, bazı ayarların bir yerden diğerine çalıştığını biliyorum.

Ve yukarıdaki liste Sourcetree tarafından çağrıldı , yine Git ile bir komut satırını yönlendirmek iyi çalışıyor gibi görünüyor %USERPROFILE%\.gitconfigve bu listede yok, ancak şöyle görünecektir (Windows 7'de)C:\Users\pawel.cioch\.gitconfig


-1

Gerçek dosya konumunu bulmak istiyorsanız, ana dizininizde olacaktır.

Gizlidir ve önünde "." Vardır.

Yani, bir Mac kullanıyorsanız, terminalinizde cd ~ && open .gitconfigen sevdiğiniz metin düzenleyicinizle açabilirsiniz, örneğin cd ~ && atom .gitconfig.


1
Bu zaten söylendi. Bir (olmayan) alternatif önererek kafa karışıklığı eklemeye gerek yok.
Stim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.