Git構成の設定はどこから来ていますか?


87

core.autocrlf実行すると2つのリストがあることに気づきましたgit 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

これらの最後の3つ(user.nameから下)は私のC:\users\username\.gitconfigファイルにある唯一のものです。他のすべてのものはどこから来ていますか?core.autocrlfが2回リストされているのはなぜですか?

これはMSysGit1.8.3であり、Sourcetreeもインストールしています(Windows7)。Sourcetreeで、「SourcetreeにグローバルGit構成ファイルの変更を許可する」のチェックを外しました


17
注:git 2.8(2016年3月)およびgit config --list --show-originでは、どのgitconfigがどこにあるかを推測する必要はありません。以下の私の答えを
VonC 2016

回答:


97

Gitは構成ファイルの4つの場所をチェックします。

  1. マシンのシステム.gitconfigファイル。
  2. にあるユーザー.gitconfigファイル~/.gitconfig
  3. 位置する第2のユーザ固有の設定ファイル$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を使用している場合は、使用している場合にポイントする~/.gitconfig場所にユーザーファイルが見つかる可能性があります。%homepath%echo %homepath%している、Windowsのコマンドプロンプトから。

ドキュメントからgit config

で明示的に設定されていない場合、構成オプションを検索する--file4つのファイルがありgit configます。

  • $(prefix)/etc/gitconfig

    システム全体の構成ファイル。

  • $XDG_CONFIG_HOME/git/config

2番目のユーザー固有の構成ファイル。場合は$XDG_CONFIG_HOME設定または空にされていない、$HOME/.config/git/config使用されます。このファイルに設定されている単一値の変数は、にあるものによって上書きされ~/.gitconfigます。このファイルのサポートはごく最近追加されたため、古いバージョンのGitを使用することがある場合は、このファイルを作成しないことをお勧めします。

  • ~/.gitconfig

ユーザー固有の構成ファイル。「グローバル」構成ファイルとも呼ばれます。

  • $GIT_DIR/config

    リポジトリ固有の構成ファイル。

それ以上のオプションが指定されていない場合、すべての読み取りオプションは、使用可能なこれらのファイルをすべて読み取ります。グローバルまたはシステム全体の構成ファイルが使用できない場合、それらは無視されます。リポジトリ構成ファイルが使用できない、または読み取れない場合は、git configゼロ以外のエラーコードで終了します。ただし、どちらの場合もエラーメッセージは発行されません。

ファイルは上記の順序で読み取られ、最後に見つかった値が前に読み取った値よりも優先されます。複数の値を取得すると、すべてのファイルのキーのすべての値が使用されます。

すべての書き込みオプションは、デフォルトでリポジトリ固有の構成ファイルに書き込みます。これは--replace-all、やなどのオプションにも影響することに注意してください --unsetgit config 一度に1つのファイルのみを変更します。

これらのルールは、コマンドラインオプションまたは環境変数のいずれかによってオーバーライドできます。--globalおよび--systemオプションは、それぞれグローバルまたはシステム全体のファイルに使用されるファイルを制限します。GIT_CONFIG環境変数は、同様の効果を持っていますが、あなたが望む任意のファイル名を指定することができます。


3
.gitconfigWindowsでmsysgitを使用している場合、「マシンのシステムファイル」はどこにありますか?
DanielSank 2014

3
@DanielSanktry C:\Program Files (x86)\Git\etc\gitconfig。しかし、それが正しいかどうかはわかりません。

@カップケーキ:ええ、それだけです。どういうわけか私はそのファイルを変更することはできません。いくつかのプロセスがそれを保持しています...どれを理解することができません。ユーザーレベルの設定で上書きできるので、問題ではないと思います。ありがとう。
DanielSank 2014

2
現在のGitの読み取りC:\Program Files\Git\mingw64\etc\gitconfig
Kevin Smyth 2017年

1
@KevinSmythこれは最近に変更されましたC:\Program Files\Git\etc\gitconfig
Enrice

62

git 2.8を使用すると、どの構成がどこに設定されているかを推測する必要がなくなります。(2016年3月)

参照70bd879コミット473166bコミット7454ee3コミット7454ee3コミット、(2016年2月19日)を473166bコミット7454ee3コミット、(2016年2月19日)を7454ee3コミット(2016年2月19日に)、そしてa0578e0コミット(2016年2月17日)をすることによってラースシュナイダー(larsxschneider
(合併によりJunio C浜野- gitster-dd0f567コミット2016年2月26日)

config:--show-origin設定値の原点を出力するための' 'オプションを追加します

設定値は「を使用して照会している場合git config(例えば」を介して--get--get-all--get-regexp、または--listフラグ)、値が定義された設定ファイルを見つけることが、時には困難です。

印刷された値ごとにソース構成ファイルを印刷するようにgit config' --show-origin' ' 'オプションを教えます。

git configmanページには、今を示します:

--show-origin:

クエリされたすべての構成オプションの出力を、オリジンタイプ(ファイル、標準入力、blob、コマンドライン)と実際のオリジン(構成ファイルパス、参照、または該当する場合は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がコメントしたように、1つの設定について:

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年第1四半期)では、次--show-scopeオプションを追加できます

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

1
ああ、助かった。gitconfigsがどこに保存されているかを推測する非常に多くの異なる記事がオンラインにあります。すべての記事で、たまたま私のマシンにセットアップされた可能性のある場所が1つありませんでした:c:\ programdata \ git \ config。理由はわかりませんが、VisualStudioのTFS統合が疑われます。私が探すのに時間がかかりすぎる他の奇妙な場所は、C:\ program files \ mingw64 \ etc \ .gitconfigとH:\。gitconfigでした。この新しいコマンドを神に感謝します。イエス。キリスト。
RMuesi 2017年

なぜ働くuser.cmdline=true必要があるのだろうか--show-origin?また、私は気づいた--show-originニーズが直後であることをconfigを使用するために--get--get-all。つまり、そうあるべきです... config --show-origin --get-all core.autocrlf
wisbucky 2017年

合意@wisbucky:私は削除し-c 'user.cmdline=true'、テスト範囲を参照するように思わビット、:github.com/git/git/blob/...
VonC

@wisbuckyそして私は1つの設定のためにあなたの例を含めました。
vonC 2017年

@VonC、ああuser.cmdline=true、Git 2.13では必要だったようですが、Git2.15では不要になりました。
wisbucky 2017年

10

以前にGitfor Windowsをインストールしてからアンインストールした後C:\Users\All Users\Git\config、システムレベルの構成ファイルがインストールされていることがわかりました。この構成ファイルは永続的であり、将来のMinGW32 Gitパッケージに影響します(私の場合、ポータブルMinGW32を実行していました)。私の会社が提供するGitパッケージ)。私が走ったとき

git config --system --edit

にあるシステム構成ファイルが表示されますが、mingw32/etc/gitconfigそれでも最初の場所から値が読み込まれます。これは、GitLFSを使用しようとしたときに構成値が衝突するという警告として表示されました。

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


これはとても便利です。すべてのユーザーでそのファイルを見つけることはありませんでした。あなたはそれで何をしましたか?
t3rm1 2016年

1
C:\ Users \ All Users \(C:\ ProgramDataのエイリアス)とC:\ Users \ foo \ AppData \ Local \ Programs \から「Git」フォルダーを削除し、残りの構成ファイルをすべて削除しました。
jinxcat2008 2016年

3

--show-origin構成がどこから来ているかを見つけるために使用できます。

Git for Windowsでの構成ファイルの優先順位:

..。

$PROGRAMDATA/Git/config::(
Windowsのみ)他のGit実装と共有されるシステム全体の構成ファイル。通常はを$PROGRAMDATA 指しC:\ProgramDataます。

$(prefix)/etc/gitconfig::
システム全体の構成ファイル。(Windowsのみ)このファイルには、Git for Windowsのこのインストールに固有の設定のみが含まれており、JGit、libgit2などの他のGit実装と共有しないでください。 --systemこのファイルを選択します。

$XDG_CONFIG_HOME/git/config::
2番目のユーザー固有の構成ファイル。場合は$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)ですか?

プレフィックスは、物事がインストールされる最上位のディレクトリです。Git for Windowsでは、それはまたはのいずれ<some-path>/mingw64<some-path>/mingw32です。


3

git config -l システム、グローバル、およびローカルから継承されたすべての値を表示します。

したがって、ユーザー定義.gitconfigファイルと一緒にロードされている別の構成ファイルがどこかにあります。


おかげで、あなたの答えは私をシステムとグローバルの違いに導きました。@Cupcakeの--systemフラグによる回答は、ファイルを見つけるのに役立ちました。
RyanW 2013

2

Windowsの完全な回答(つまり、受け入れられた回答のWindowsバージョン):

Linuxと同様に、Windowsには4つのレベルの構成ファイル/設定があり、3つは直接同等です。注意すべき重要なことは、もう1つ(「すべてのアプリ/ユーザー」)です。これは、インストーラーが値を設定する場所であるためです。たとえば、「core.autocrlf = true」ですが、コマンドラインからアクセスすることはできません。混乱を招きます。

すべてのアプリケーションとユーザー

これは、複数のGitアプリケーションがインストールされている場合の「システム」設定の共有バージョンのようなものです。これらにアクセスするための「gitconfig」コマンドはありませんが、設定の最終結果に影響を与えます。

構成ファイルの場所:

C:\ ProgramData \ Git \ config

(古いバージョンのWindowsでは、「ProgramData」は「AllUsers」であったことに注意してください。)

システム

構成ファイルの場所: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

1

Windows 7(Windows 10でも同じか類似している可能性があります)では、Visual StudioとGitコマンドラインの場合、グローバル構成は次のようになります。

%USERPROFILE%\.gitconfig

(ドットはファイル名の前にあります)

しかし、これは、少なくともGit Embeddedモードでは、Sourcetreeによって尊重されておらず、構成は次のとおりです。

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

(ファイル名の前にドットはありません)

(GitコマンドとSourcetreeのグローバルGit設定を変更するには、両方のファイルを更新する必要がありました。)

もう一つの楽しい部分。Gitのフック設定はから働いていたAppData\Local\...場所が、経由してより多くの研究の後にプロセスモニタ、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


1

に加えてgit config -l --show-originここ紹介したgit 2.8(2016年3月)では、Git 2.26(2020年第1四半期)があります。

git config -l --show-scope

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

git configscopeどのファイルに加えて、各構成設定がどのファイルからのものであるかを示すことを学びました。

参照145d59fをコミットし9a83d08をコミットしe37efa4をコミットし5c105a8をコミットし6766e41をコミットし6dc905dをコミットしa5cb420をコミット(2020年2月10)、及び417be08をコミットし3de7ee3をコミットし329e6ecコミットにより(2020年1月24日)のマシュー・ロジャース(ROGERSM94
(合併によりJunio C浜野- gitster-5d55554コミットし、2020年2月17日)を

config: '-show-scope'を追加して、構成値のスコープを出力します

サインオフ:Matthew Rogers

ユーザーが構成値を--show-originで照会すると、実際の「scope」(local、)を判別するのが難しいことがよくあります。globalなど、)与えられた値のちょうど元のファイルに基づいています。

'git config' ' --show-scope'オプションを教えて、表示されているすべての構成値のスコープを出力します。

submodule-config.c'.gitmodules'ファイルを解析するときにのみ使用されるため、「サブモジュール」スコープは表示されないことに注意してください。

例:

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

実際のファイルの場所を見つけたい場合は、ホームディレクトリにあります。

非表示になり、前に「。」が付きます。

したがって、Macを使用している場合は、ターミナルcd ~ && open .gitconfigで、お気に入りのテキストエディタを使用して開くことができますcd ~ && atom .gitconfig


1
これはすでに言われています。(非)代替案を提案して混乱を加える必要はありません。
スティム2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.