web-dev-qa-db-ja.com

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

core.autocrlfを実行すると、git config -lのリストが2つあることに気付きました

$ 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

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

これはmsysgit 1.8.3であり、SourceTreeもインストールされています(Windows 7)。 SourceTreeでは、「SourceTreeがグローバルGit構成ファイルを変更できるようにする」のチェックを外しました。

79
RyanW

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

  1. マシンのシステム.gitconfigファイル。
  2. ユーザー.gitconfigファイルは~/.gitconfigにあります。
  3. $XDG_CONFIG_HOME/git/configまたは$HOME/.config/git/configにある2番目のユーザー固有の構成ファイル。
  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コマンドプロンプトから~/.gitconfigを使用すると、%homepath%が指すユーザーecho %homepath%ファイルが見つかるでしょう。

git configのドキュメント から:

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

  • $(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--unsetなどのオプションにも影響することに注意してください。 git configは一度に1つのファイルのみを変更します。

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

93
user456814

Git 2.8では、どの設定がどこに設定されているかを推測する必要がなくなりました! (2016年3月)

commit 70bd879commit 473166bcommit 7454eecommit 7454ee (2016年2月19日)、 コミット473166bコミット7454ee (2016年2月19日)、 コミット7454ee (2016年2月19日)、および コミットa0578e (2016年2月17日) ) Lars Schneider(larsxschneider によって。
浜野潤夫-gitster- in commit dd0f567 、2016年2月26日)

config: '--show-Origin'オプションを追加して、構成値の起点を出力します

'git config'を使用して構成値を照会する場合(たとえば、--get--get-all--get-regexp、または--listフラグを使用して)、検索が難しい場合があります。値が定義された構成ファイル。

'git config'に '--show-Origin'オプションを教えて、印刷されたすべての値のソース構成ファイルを印刷します。

git config manページ は以下を示します。

--show-Origin:

Originタイプ(ファイル、標準入力、blob、コマンドライン)と実際のOrigin(構成ファイルパス、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

コメント付き by wisbucky のような設定の場合:

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

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

以前に 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

10
jinxcat2008

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

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

3
CBIII

--show-Originを使用して、構成がどこから来たかを調べることができます。

Git for Windowsの設定ファイルの優先度:

...

$PROGRAMDATA/Git/config ::
(Windowsのみ)他のGit実装と共有されるシステム全体の構成ファイル。通常、$PROGRAMDATAC:\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のいずれかです。

2
Ini

私は、Windowsに対する完全な答え(つまり、受け入れられた答えのWindowsバージョン)はないと思うので、別の答えを追加しています。

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

すべてのアプリ/ユーザー

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

構成ファイルの場所:
C:\ ProgramData\Git\config
(Windowsの古いバージョンでは、「ProgramData」は「All Users」でした)

システム

構成ファイルの場所:
C:/ Program Files/Git/mingw64/etc/gitconfig

$ git config --system --list

ユーザー

構成ファイルの場所:
%USERPROFILE%.gitconfig
(これはc:/ Users/'に解決されます)

$ git config --global --list

レポ

構成ファイルの場所:
[現在のレポジトリディレクトリ] /。git/config

$ git config --local --list

1
Tom

Visual Studioおよびgitコマンドライン用のWindows 7(Windows 10でも同じまたは類似)の場合、グローバル構成は

%USERPROFILE%\.gitconfig

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

しかし、これは少なくともGit EmbeddedモードではSourceTreeによって尊重されず、設定は

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

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

[gitコマンドとSourceTreeのグローバルgit設定を変更するには、両方のファイルを更新する必要がありました]

別の楽しい部分。 Gitフックの設定はAppData\Local\...の場所から機能していましたが、procmonを使用してさらに調査した結果、SourceTreeがユーザーの会社にマップされたドライブからグローバルを読み込んでいることに気付きました。この場所を参照するアプリケーションはほとんどないため、これはほとんど意味がありません.STで場所ごとの設定を行い、procmon.exeを実行し、gitconfigを含むパスのみを記録するルールを作成できない場合、STは何らかの方法でそうしますネットワークマップされたユーザーディレクトリの場合、本当にあなたのグローバル設定はどこにあります。これは、今書いているように、git.exeがそれをロードしていることを示しているように、これはSTの障害ではないかもしれませんが、これはSTによって実行されるgit.exeに対してのみ発生しますが、直接コマンドラインgitは%USERPROFILE%\.gitconfigを使用します

enter image description here

最後に、procmonからすべての結果を取得し、SQLにフィードし、クエリを実行して個別の結果を取得しました(特定の実行順序はパスでソートされていません)。

enter image description here

これらの構成が互いにどのように関連するかはわかりませんが、ある場所から別の場所にあるいくつかの設定がいくつかの設定をオーバーライドすることは知っています。 そして上記のリストはSourceTreeによって呼び出されますが、再びgitの直接コマンドラインは%USERPROFILE%\.gitconfigでうまく動作するようで、このリストにはありませんしかし、このようになります(Win7)c:\Users\pawel.cioch\.gitconfig

0
Pawel Cioch