¿De dónde provienen las configuraciones en mi configuración de Git?

87

He notado que tengo dos listas para core.autocrlfcuando ejecutogit 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

Los últimos tres (desde user.name hacia abajo) son los únicos en mi C:\users\username\.gitconfigarchivo. ¿De dónde vienen todos los demás? ¿Por qué core.autocrlf aparece dos veces?

Esto es con MSysGit 1.8.3, y también tengo instalado Sourcetree (Windows 7). En Sourcetree, he desmarcado "Permitir que Sourcetree modifique sus archivos de configuración globales de Git"

RyanW
fuente
17
Nota: con git 2.8 (marzo de 2016) y git config --list --show-origin, no tendrás que adivinar qué configuración de git está dónde. Vea mi respuesta a continuación
VonC

Respuestas:

97

Git busca un archivo de configuración en cuatro lugares:

  1. El .gitconfigarchivo de sistema de su máquina .
  2. Su .gitconfigarchivo de usuario ubicado en ~/.gitconfig.
  3. Un segundo archivo de configuración específico del usuario ubicado en $XDG_CONFIG_HOME/git/configo $HOME/.config/git/config.
  4. El archivo de configuración del repositorio local .git/config.

Las configuraciones se despliegan en el siguiente orden, con cada archivo agregando o anulando configuraciones definidas en el archivo arriba.

  1. Configuración del sistema.
  2. Configuración de usuario.
  3. Configuración específica del repositorio.

Puedes ver lo que ha definido cada archivo usando los siguientes comandos:

# 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

Puede ver lo que solo ha definido el archivo específico del repositorio abriendo el archivo .git/configpara ese repositorio.

Si está usando MSysGit en Windows, probablemente encontrará su ~/.gitconfigarchivo de usuario donde sea que %homepath%apunte si lo usa echo %homepath%desde un símbolo del sistema de Windows.

De la documentación paragit config :

Si no se establece explícitamente con --file, hay cuatro archivos donde git configbuscará opciones de configuración:

  • $(prefix)/etc/gitconfig

    Archivo de configuración de todo el sistema.

  • $XDG_CONFIG_HOME/git/config

Segundo archivo de configuración específico del usuario. Si $XDG_CONFIG_HOMEno está configurado o vacío, $HOME/.config/git/configse utilizará. Cualquier variable de un solo valor establecida en este archivo será sobrescrita por lo que sea ~/.gitconfig. Es una buena idea no crear este archivo si a veces usa versiones anteriores de Git, ya que recientemente se agregó soporte para este archivo.

  • ~/.gitconfig

Archivo de configuración específico del usuario. También llamado archivo de configuración "global".

  • $GIT_DIR/config

    Archivo de configuración específico del repositorio.

Si no se dan más opciones, todas las opciones de lectura leerán todos estos archivos que estén disponibles. Si el archivo de configuración global o de todo el sistema no está disponible, se ignorarán. Si el archivo de configuración del repositorio no está disponible o no se puede leer, se git configcerrará con un código de error distinto de cero. Sin embargo, en ningún caso se emitirá un mensaje de error.

Los archivos se leen en el orden indicado anteriormente, y el último valor encontrado tiene prioridad sobre los valores leídos anteriormente. Cuando se toman varios valores, se utilizarán todos los valores de una clave de todos los archivos.

Todas las opciones de escritura escribirán por defecto en el archivo de configuración específico del repositorio. Tenga en cuenta que esto también afecta a opciones como --replace-ally --unset. git config solo cambiará un archivo a la vez.

Puede anular estas reglas mediante opciones de línea de comandos o variables de entorno. Las opciones --globaly las --systemlimitarán el archivo utilizado al archivo global o del sistema, respectivamente. La GIT_CONFIGvariable de entorno tiene un efecto similar, pero puede especificar el nombre de archivo que desee.

Peter Mortensen
fuente
3
¿Dónde está el " .gitconfigarchivo de sistema de la máquina " cuando está en Windows con msysgit?
DanielSank
3
@DanielSank prueba C:\Program Files (x86)\Git\etc\gitconfig. Sin embargo, no estoy seguro de si ese es el correcto.
@ Cupcake: Sí, eso fue todo. Sin embargo, por alguna razón no puedo modificar ese archivo. Algún proceso se está aferrando a él ... no puedo averiguar cuál. Supongo que no importa, ya que puedo anular las configuraciones a nivel de usuario. Gracias.
DanielSank
2
Git actual leeC:\Program Files\Git\mingw64\etc\gitconfig
Kevin Smyth
1
@KevinSmyth esto cambió recientemente aC:\Program Files\Git\etc\gitconfig
Enrice
62

¡Ya no tienes que adivinar qué configuración se ha establecido en dónde, con git 2.8! (Marzo de 2016)

Consulte la confirmación 70bd879 , la confirmación 473166b , la confirmación 7454ee3 , la confirmación 7454ee3 (19 de febrero de 2016), la confirmación 473166b , la confirmación 7454ee3 (19 de febrero de 2016), la confirmación 7454ee3 (19 de febrero de 2016) y la confirmación a0578e0 (17 de febrero de 2016) por Lars Schneider ( larsxschneider) .
(Combinado por Junio ​​C Hamano - gitster- en el compromiso dd0f567 , 26 de febrero de 2016)

config: agregar la --show-originopción ' ' para imprimir el origen de un valor de configuración

Si los valores de configuración se consultan usando ' git config' (por ejemplo, a través de --get, --get-all, --get-regexp, o --listbandera), entonces a veces es difícil encontrar el archivo de configuración donde se definieron los valores.

Enseñe ' git config' la ' --show-origin' opción para imprimir el archivo de configuración de origen para cada valor impreso.

La git configpágina de manual ahora indicará:

--show-origin:

Aumente la salida de todas las opciones de configuración consultadas con el tipo de origen (archivo, entrada estándar, blob, línea de comando) y el origen real (ruta del archivo de configuración, ref o id de blob si corresponde).

Por ejemplo:

git config --list --show-origin

Eso volverá:

    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

Para un entorno, como comentado por wisbucky :

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

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

Con Git 2.26 (Q1 2020), puede agregar la --show-scopeopción :

git config -l --show-origin --show-scope
VonC
fuente
1
gracias a Dios. Tantos artículos diferentes en línea adivinando dónde se pueden haber almacenado las configuraciones de git. Todos los artículos perdieron una ubicación posible que estaba configurada en mi máquina: c: \ programdata \ git \ config. No sé por qué está ahí, pero sospecho que la integración TFS de Visual Studio. Las otras ubicaciones extrañas que paso demasiado tiempo buscando fueron: C: \ archivos de programa \ mingw64 \ etc \ .gitconfig y H: \. Gitconfig. Gracias a Dios por este nuevo comando. Jesús. Cristo.
RMuesi
Me pregunto por qué user.cmdline=truese requiere --show-originque funcione. Además, he notado que --show-origindebe ser inmediatamente posterior configpara poder trabajar con --gety --get-all. Así debería ser... config --show-origin --get-all core.autocrlf
wisbucky
@wisbucky De acuerdo: elimino el -c 'user.cmdline=true'bit, que parece referirse al alcance de la prueba: github.com/git/git/blob/…
VonC
@wisbucky Y he incluido tu ejemplo para una configuración.
VonC
@VonC, parece que Ah user.cmdline=trueera necesario en Git 2.13, pero ya no es necesario en Git 2.15.
wisbucky
10

Después de haber instalado Git para Windows y posteriormente desinstalarlo, descubrí que hay un archivo de configuración instalado en el C:\Users\All Users\Git\configque hay un archivo de configuración a nivel del sistema que persiste y afectará a cualquier paquete futuro de MinGW32 Git (en mi caso, estaba ejecutando un MinGW32 portátil Paquete de Git proporcionado por mi empresa). Cuando corrí

git config --system --edit

me mostraría el archivo de configuración del sistema ubicado en mingw32/etc/gitconfig, pero también cargaría los valores desde la primera ubicación. Esto se mostró como una advertencia de que los valores de configuración entraban en conflicto al intentar usar 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"

(Nota: esta también puede ser una situación en la que las advertencias de LFS sean demasiado asertivas, # 861 )

jinxcat2008
fuente
Esto es muy útil. Nunca habría encontrado ese archivo en Todos los usuarios. Qué hiciste con eso?
T3rm1
1
Eliminé las carpetas 'Git' de C: \ Users \ All Users \ (un alias para C: \ ProgramData) y C: \ Users \ foo \ AppData \ Local \ Programs \ que eliminaron todos los archivos de configuración sobrantes.
jinxcat2008
3

Puede usarlo --show-originpara averiguar de dónde provienen las configuraciones.

Prioridad de los archivos de configuración en Git para Windows:

...

$PROGRAMDATA/Git/config::
(Solo Windows) Archivo de configuración de todo el sistema compartido con otras implementaciones de Git. Normalmente $PROGRAMDATA apunta a C:\ProgramData.

$(prefix)/etc/gitconfig::
Archivo de configuración de todo el sistema. (Solo para Windows) Este archivo contiene solo las configuraciones que son específicas para esta instalación de Git para Windows y que no deben compartirse con otras implementaciones de Git como JGit, libgit2. --systemseleccionará este archivo.

$XDG_CONFIG_HOME/git/config::
Segundo archivo de configuración específico del usuario. Si $XDG_CONFIG_HOMEno está configurado o vacío, $HOME/.config/git/configse utilizará. Cualquier variable de un solo valor establecida en este archivo será sobrescrita por lo que sea ~/.gitconfig. Es una buena idea no crear este archivo si a veces usa versiones anteriores de Git, ya que recientemente se agregó soporte para este archivo.

~/.gitconfig::
Archivo de configuración específico del usuario. También llamado archivo de configuración "global".

$GIT_DIR/config::
Archivo de configuración específico del repositorio.

...

Los archivos se leen en el orden indicado anteriormente, y el último valor encontrado tiene prioridad sobre los valores leídos anteriormente.

...

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

$PROGRAMDATAes una variable de entorno. Puede obtener el valor de esas variables de esta manera:

En Git Bash necesitas usar echo "$ProgramData". En CMD, debe usarecho %PROGRAMDATA% . Tenga en cuenta que Git Bash aparentemente pretende que las variables de entorno distinguen entre mayúsculas y minúsculas.

Que es $(prefix) ?

El prefijo es el directorio de nivel superior en el que se instalan las cosas. En Git para Windows, eso es <some-path>/mingw64o <some-path>/mingw32.

Ini
fuente
3

git config -l muestra todos los valores heredados del sistema, global y local.

Entonces, tiene otro archivo de configuración en algún lugar que se está cargando junto con su .gitconfigarchivo definido por el usuario .

CBIII
fuente
Gracias, su respuesta me indicó la diferencia entre sistema y global. Sin embargo, la respuesta de @ Cupcake con las banderas --system me ayudó a encontrar el archivo.
RyanW
2

Una respuesta completa para Windows (es decir, una versión de Windows de la respuesta aceptada):

Como Linux, Windows tiene cuatro niveles de archivos / configuraciones de configuración y tres son equivalentes directos. Lo importante a tener en cuenta es el otro, el de 'Todas las aplicaciones / usuarios', especialmente porque aquí es donde el instalador establece los valores, por ejemplo, 'core.autocrlf = true', y sin embargo, no se puede acceder a él desde la línea de comandos por lo que causa confusión.

Todas las aplicaciones y usuarios

Esto es como una versión compartida de la configuración del 'sistema' en caso de que tenga instaladas varias aplicaciones Git. No hay un comando 'git config' para acceder a estos, pero aún afectan el resultado neto de una configuración.

Ubicación del archivo de configuración:

C: \ ProgramData \ Git \ config

(Tenga en cuenta que 'ProgramData' era 'Todos los usuarios' en versiones anteriores de Windows).

Sistema

Ubicación del archivo de configuración: C: / Archivos de programa / Git / mingw64 / etc / gitconfig

$ git config --system --list

Usuario

Ubicación del archivo de configuración:% USERPROFILE% .gitconfig (Esto se resuelve en 'C: / Users / <username>')

$ git config --global --list

Repositorio

Ubicación del archivo de configuración: [directorio del repositorio actual] /. Git / config

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

Además de lo git config -l --show-originque presenté aquí , con git 2.8 (marzo de 2016), ahora tiene, con Git 2.26 (Q1 2020)

git config -l --show-scope

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

git config aprendí a mostrar en qué "scope ", además de en qué archivo, proviene cada ajuste de configuración.

Consulte la confirmación 145d59f , la confirmación 9a83d08 , la confirmación e37efa4 , la confirmación 5c105a8 , la confirmación 6766e41 , la confirmación 6dc905d , la confirmación a5cb420 (10 de febrero de 2020) y la confirmación 417be08 , la confirmación 3de7ee3 , la confirmación 329e6ec (24 de enero de 2020) por Matthew Rogers ( ROGERSM94) .
(Combinado por Junio ​​C Hamano - gitster- en el compromiso 5d55554 , 17 de febrero de 2020)

config: agregue '--show-scope' para imprimir el alcance de un valor de configuración

Firmado por: Matthew Rogers

Cuando un usuario consulta valores de configuración con --show-origin, a menudo es difícil determinar cuál es " scope" ( local,global , etc.) de un valor dado se basa sólo en el archivo de origen.

Enséñele a 'git config' el '--show-scope opción ' para imprimir el alcance de todos los valores de configuración mostrados.

Tenga en cuenta que nunca deberíamos ver nada del alcance del "submódulo", ya que solo lo usa submodule-config.ccuando se analiza el archivo '.gitmodules'.

Ejemplo:

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
fuente
1

En Windows 7 (tal vez el mismo o similar para Windows 10), para Visual Studio y la línea de comandos de Git, su configuración global está en:

%USERPROFILE%\.gitconfig

(el punto está delante del nombre del archivo)

Pero esto no es respetado por Sourcetree, al menos en el modo Git Embedded, y la configuración está en:

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

(sin punto delante del nombre del archivo)

(Necesitaba actualizar ambos archivos para modificar mi configuración global de Git para el comando Git y Sourcetree).

Otra parte divertida. La configuración de los ganchos de Git funcionaba desde la AppData\Local\...ubicación, pero después de más investigación a través de Process Monitor , noté que de alguna manera Sourcetree también se está cargando globalmente desde la unidad asignada por la empresa para mi usuario.

Esto tiene muy poco sentido ya que muy pocas aplicaciones buscan esta ubicación, pero de alguna manera Sourcetree lo hace, por lo que si no puede hacerlo funcionar según la configuración de ubicación en Sourcetree, ejecute Process Monitor y cree una regla para registrar solo la ruta que contenga gitconfig, y usted puede encontrar dónde está realmente su configuración global en el caso de un directorio de usuarios mapeado en red.

Y esto puede que ni siquiera sea culpa de Sourcetree, como veo ahora, mientras escribo esto, que git.exe está cargando eso, pero esto sucede solo para git.exe ejecutado por Sourcetree, mientras que una línea de comando directa Git usa %USERPROFILE%\.gitconfig

Ingrese la descripción de la imagen aquí

Finalmente, tomé todos los resultados de Process Monitor, los introduje en SQL Server y ejecuté una consulta para obtener resultados distintos (ningún orden de ejecución en particular, solo ordenado por ruta):

Ingrese la descripción de la imagen aquí

No sé cómo se relacionan esas configuraciones entre sí, pero sé que algunas anulan a otras, algunas configuraciones funcionan desde una ubicación y otras desde otra.

Y Sourcetree invoca la lista anterior , nuevamente dirigir una línea de comando con Git parece funcionar bien %USERPROFILE%\.gitconfig, y eso no está en esta lista, pero se vería así (en Windows 7)C:\Users\pawel.cioch\.gitconfig

Pawel Cioch
fuente
-1

Si desea buscar para encontrar la ubicación real del archivo, estará en su directorio de inicio.

Está oculto y precedido por un ".".

Entonces, si está en una Mac, en su terminal puede cd ~ && open .gitconfigabrirlo con su editor de texto favorito, por ejemplo cd ~ && atom .gitconfig.

AshNaz87
fuente
1
Esto ya se ha dicho. No es necesario agregar confusión sugiriendo una (no) alternativa.
Stim