Nice programing

내 Git 구성의 설정은 어디에서 가져 오나요?

nicepro 2020. 10. 9. 12:23
반응형

내 Git 구성의 설정은 어디에서 가져 오나요?


내가 core.autocrlf실행할 때 두 개의 목록이 있음을 알았 습니다.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

마지막 세 개 (user.name 아래에서)는 내 C:\users\username\.gitconfig파일 에있는 유일한 것입니다 . 다른 모든 것들은 어디에서 왔습니까? core.autocrlf가 두 번 나열되는 이유는 무엇입니까?

이것은 MSysGit 1.8.3과 함께 있으며 Sourcetree도 설치되어 있습니다 (Windows 7). Sourcetree에서 "Allow Sourcetree to modify your global Git config files"를 선택 취소했습니다.


Git은 구성 파일의 네 위치를 확인합니다.

  1. 컴퓨터의 시스템 .gitconfig파일.
  2. 에있는 사용자 .gitconfig파일 ~/.gitconfig.
  3. 에있는 두 번째 사용자 별 구성 파일 $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을 사용 하는 경우 Windows 명령 프롬프트에서 사용하면 가리키는 ~/.gitconfig위치에서 사용자 파일을 찾을 수 있습니다 .%homepath%echo %homepath%

에 대한 문서에서git config :

로 명시 적으로 설정하지 않은 경우 구성 옵션을 검색 할 --file4 개의 파일이 git config있습니다.

  • $(prefix)/etc/gitconfig

    시스템 전체 구성 파일.

  • $XDG_CONFIG_HOME/git/config

두 번째 사용자 별 구성 파일입니다. 경우 $XDG_CONFIG_HOME설정하거나 비어 있지 않은, $HOME/.config/git/config사용됩니다. 이 파일에 설정된 단일 값 변수는 ~/.gitconfig. 이 파일에 대한 지원이 상당히 최근에 추가되었으므로 때때로 이전 버전의 Git을 사용하는 경우이 파일을 생성하지 않는 것이 좋습니다.

  • ~/.gitconfig

사용자 별 구성 파일. "글로벌"구성 파일이라고도합니다.

  • $GIT_DIR/config

    저장소 특정 구성 파일.

추가 옵션이 제공되지 않으면 모든 읽기 옵션이 사용 가능한 모든 파일을 읽습니다. 전역 또는 시스템 전체 구성 파일을 사용할 수없는 경우 무시됩니다. 저장소 구성 파일을 사용할 수 없거나 읽을 수 git config없는 경우 0이 아닌 오류 코드와 함께 종료됩니다. 그러나 두 경우 모두 오류 메시지가 발행되지 않습니다.

파일은 위에 주어진 순서대로 읽히고 마지막으로 찾은 값이 이전에 읽은 값보다 우선합니다. 여러 값을 가져 오면 모든 파일의 모든 키 값이 사용됩니다.

모든 쓰기 옵션은 기본적으로 저장소 특정 구성 파일에 기록됩니다. 이것은 또한 같은 옵션에 영향을줍니다 --replace-all--unset. git config 한 번에 하나의 파일 만 변경합니다.

명령 줄 옵션 또는 환경 변수로 이러한 규칙을 재정의 할 수 있습니다. --global--system옵션은 각각 전역 또는 전체 시스템 파일에 사용되는 파일을 제한합니다. GIT_CONFIG환경 변수도 비슷한 효과를 가지고 있지만, 당신은 당신이 원하는 파일 이름을 지정할 수 있습니다.


git 2.8을 사용하면 어떤 구성이 어디에 설정되었는지 더 이상 추측 할 필요가 없습니다! (2016 년 3 월)

참조 70bd879 커밋 , 473166b 커밋 , 7454ee3 커밋 , 7454ee3 커밋 (2,016 19 이월) 473166b 커밋 , 7454ee3 커밋 (19 2,016 이월)는, 7454ee3 커밋 (2,016 19 이월) 및 a0578e0 커밋 그래피 (17 이월 2016) 라스 슈나이더 ( larsxschneider) .
(Merged by Junio ​​C gitsterHamano -- in commit dd0f567 , 26 Feb 2016)

구성 : --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 :

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

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

이전 에 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 )


--show-origin구성의 출처를 찾기 위해 사용할 수 있습니다 .

Configuration files priority in Git for Windows:

...

$PROGRAMDATA/Git/config::
(Windows-only) System-wide configuration file shared with other Git implementations. Typically $PROGRAMDATA points to C:\ProgramData.

$(prefix)/etc/gitconfig::
System-wide configuration file. (Windows-only) This file contains only the settings which are specific for this installation of Git for Windows and which should not be shared with other Git implementations like JGit, libgit2. --system will select this file.

$XDG_CONFIG_HOME/git/config::
Second user-specific configuration file. If $XDG_CONFIG_HOME is not set or empty, $HOME/.config/git/config will be used. Any single-valued variable set in this file will be overwritten by whatever is in ~/.gitconfig. It is a good idea not to create this file if you sometimes use older versions of Git, as support for this file was added fairly recently.

~/.gitconfig::
User-specific configuration file. Also called "global" configuration file.

$GIT_DIR/config::
Repository specific configuration file.

...

The files are read in the order given above, with last value found taking precedence over values read earlier.

...

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

$PROGRAMDATA is an environment variable. You can get the value of those variables like this:

In Git Bash you need to use echo "$ProgramData". In CMD, you need to use echo %PROGRAMDATA%. Note that Git Bash apparently pretends that environment variables are case sensitive.

What is $(prefix)?

The prefix is the top-level directory into which things get installed. In Git for Windows, that's either <some-path>/mingw64 or <some-path>/mingw32.


git config -l shows all inherited values from system, global, and local.

So you have another configuration file somewhere that is being loaded along with your user-defined .gitconfig file.


A complete answer for Windows (i.e. a Windows version of the accepted answer):

Like Linux, Windows has four levels of config files/settings and three are direct equivalents. The important thing to note is the other one - the 'All Apps/Users' one - particularly since this is where the installer sets values, e.g. 'core.autocrlf = true', and yet it can't be accessed from the command line so it causes confusion.

All Applications and Users

This is like a shared version of the ‘system’ settings in case you have multiple Git applications installed. There is no 'git config' command to access these, but they still impact the net result for a setting.

Configuration file location:

C:\ProgramData\Git\config

(Note that 'ProgramData' was 'All Users' on older versions of Windows.)

System

Configuration file location: C:/Program Files/Git/mingw64/etc/gitconfig

$ git config --system --list

User

Configuration file location: %USERPROFILE%.gitconfig (This resolves to 'C:/Users/<username>')

$ git config --global --list

Repository

Configuration file location: [current repository directory]/.git/config

$ git config --local --list

On Windows 7 (maybe the same or similar for Windows 10), for Visual Studio and the Git command line, your global configuration is in:

%USERPROFILE%\.gitconfig

(dot is in front of the file name)

But this is not honored by Sourcetree, at least in Git Embedded mode, and the configuration is in:

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

(no dot in front of the file name)

(I needed to update both files to modify my global Git settings for Git command and Sourcetree.)

Another fun part. The Git hooks configuration was working from the AppData\Local\... location, but after more research via Process Monitor, I noticed somehow Sourcetree is also loading global from company mapped drive for my user.

This makes very little sense as very few applications lookup this location, but somehow Sourcetree does, so if you can't make it to work per location settings at Sourcetree, run Process Monitor and create a rule to log only path containing gitconfig, and you can find where really your global configuration is in case of a network-mapped user directory.

And this may not be even fault of Sourcetree, as I see now as I write this that git.exe is loading that, but this happens only for git.exe executed by Sourcetree, while a direct command line Git uses %USERPROFILE%\.gitconfig

Enter image description here

Finally I took all the results from Process Monitor, fed it into SQL Server and ran a query to get distinct results (no particular execution order just sorted by path):

Enter image description here

I don't know how those configurations relate to each-other, but I know some override another some settings works from one location some from another.

And the above list is invoked by Sourcetree, again direct a command line with Git seems to work fine with %USERPROFILE%\.gitconfig, and that is not on this list, but it would look like this (on Windows 7 ) C:\Users\pawel.cioch\.gitconfig


If you want to find to find the actual file location, it'll be in your home directory.

It is hidden and preceded with a ".".

So if you're on a Mac, in your terminal you can cd ~ && open .gitconfig or open it with your favourite text editor, e.g cd ~ && atom .gitconfig.

참고URL : https://stackoverflow.com/questions/17756753/where-do-the-settings-in-my-git-configuration-come-from

반응형