D'où viennent les paramètres de ma configuration Git?

87

J'ai remarqué que j'avais deux annonces pour core.autocrlfquand je coursgit 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

Ces trois derniers (de user.name vers le bas) sont les seuls dans mon C:\users\username\.gitconfigfichier. D'où viennent tous les autres? Pourquoi core.autocrlf est-il répertorié deux fois?

C'est avec MSysGit 1.8.3, et j'ai également installé Sourcetree (Windows 7). Dans Sourcetree, j'ai décoché la case "Autoriser Sourcetree à modifier vos fichiers de configuration Git globaux"

RyanW
la source
17
Remarque: avec git 2.8 (mars 2016) et git config --list --show-origin, vous n'aurez pas à deviner quelle configuration git est où. Voir ma réponse ci
VonC

Réponses:

97

Git vérifie quatre emplacements pour un fichier de configuration:

  1. .gitconfigFichier système de votre machine .
  2. Votre .gitconfigfichier utilisateur situé à ~/.gitconfig.
  3. Un deuxième fichier de configuration spécifique à l'utilisateur situé à $XDG_CONFIG_HOME/git/configou $HOME/.config/git/config.
  4. Le fichier de configuration du référentiel local .git/config.

Les paramètres en cascade dans l'ordre suivant, chaque fichier ajoutant ou remplaçant les paramètres définis dans le fichier au-dessus.

  1. Configuration du système.
  2. Configuration utilisateur.
  3. Configuration spécifique au référentiel.

Vous pouvez voir ce que chaque fichier a défini à l'aide des commandes suivantes:

# 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

Vous pouvez voir ce que seul le fichier spécifique au référentiel a défini en ouvrant le fichier .git/configpour ce référentiel.

Si vous utilisez MSysGit sous Windows, vous trouverez probablement votre ~/.gitconfigfichier utilisateur où qu'il %homepath%pointe si vous utilisez à echo %homepath%partir d'une invite de commande Windows.

De la documentation pourgit config :

S'il n'est pas défini explicitement avec --file, il existe quatre fichiers dans lesquels git configrechercher des options de configuration:

  • $(prefix)/etc/gitconfig

    Fichier de configuration à l'échelle du système.

  • $XDG_CONFIG_HOME/git/config

Deuxième fichier de configuration spécifique à l'utilisateur. Si $XDG_CONFIG_HOMEn'est pas défini ou vide, $HOME/.config/git/configsera utilisé. Toute variable à valeur unique définie dans ce fichier sera écrasée par tout ce qui se trouve dans ~/.gitconfig. C'est une bonne idée de ne pas créer ce fichier si vous utilisez parfois des versions plus anciennes de Git, car la prise en charge de ce fichier a été ajoutée assez récemment.

  • ~/.gitconfig

Fichier de configuration spécifique à l'utilisateur. Aussi appelé fichier de configuration "global".

  • $GIT_DIR/config

    Fichier de configuration spécifique au référentiel.

Si aucune autre option n'est donnée, toutes les options de lecture liront tous ces fichiers disponibles. Si le fichier de configuration global ou à l'échelle du système n'est pas disponible, il sera ignoré. Si le fichier de configuration du référentiel n'est pas disponible ou lisible, se git configterminera avec un code d'erreur différent de zéro. Cependant, dans aucun des cas, un message d'erreur ne sera émis.

Les fichiers sont lus dans l'ordre indiqué ci-dessus, la dernière valeur trouvée ayant priorité sur les valeurs lues précédemment. Lorsque plusieurs valeurs sont prises, toutes les valeurs d'une clé de tous les fichiers seront utilisées.

Toutes les options d'écriture seront écrites par défaut dans le fichier de configuration spécifique au référentiel. Notez que cela affecte également les options telles que --replace-allet --unset. git config ne changera jamais qu'un seul fichier à la fois.

Vous pouvez remplacer ces règles par des options de ligne de commande ou par des variables d'environnement. Les --globalet les --systemoptions limitent le fichier utilisé pour le fichier global ou à l' échelle du système , respectivement. La GIT_CONFIGvariable d'environnement a un effet similaire, mais vous pouvez spécifier le nom de fichier de votre choix.

Peter Mortensen
la source
3
Où est le « .gitconfigfichier système de la machine » sous Windows avec msysgit?
DanielSank
3
@DanielSank essayez C:\Program Files (x86)\Git\etc\gitconfig. Je ne sais pas si c'est la bonne.
@Cupcake: Ouais, c'était ça. Pour une raison quelconque, je ne peux pas modifier ce fichier. Un processus s'y accroche ... je n'arrive pas à savoir lequel. Je suppose que cela n'a pas d'importance car je peux simplement remplacer dans les configurations au niveau de l'utilisateur. Merci.
DanielSank le
2
Lectures actuelles de GitC:\Program Files\Git\mingw64\etc\gitconfig
Kevin Smyth
1
@KevinSmyth cela a récemment changé enC:\Program Files\Git\etc\gitconfig
Enrice le
62

Vous n'avez plus à deviner quelle configuration a été définie où, avec git 2.8! (Mars 2016)

Voir commit 70bd879 , commit 473166b , commit 7454ee3 , commit 7454ee3 (19 février 2016), commit 473166b , commit 7454ee3 (19 février 2016), commit 7454ee3 (19 février 2016) et commit a0578e0 (17 février 2016) par Lars Schneider ( larsxschneider) .
(Fusionné par Junio ​​C Hamano - gitster- in commit dd0f567 , 26 févr.2016 )

config: ajouter l' --show-originoption ' ' pour imprimer l'origine d'une valeur de configuration

Si les valeurs de configuration sont consultées en utilisant « git config» (par exemple via --get, --get-all, --get-regexpou --listdrapeau), il est parfois difficile de trouver le fichier de configuration où les valeurs ont été définies.

Apprenez à ' git config' l' --show-originoption ' ' pour imprimer le fichier de configuration source pour chaque valeur imprimée.

La git configpage de manuel indiquera maintenant:

--show-origin:

Augmentez la sortie de toutes les options de configuration interrogées avec le type d'origine (fichier, entrée standard, blob, ligne de commande) et l'origine réelle (chemin du fichier de configuration, référence ou identifiant de blob le cas échéant).

Par exemple:

git config --list --show-origin

Cela reviendra:

    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

Pour un réglage, comme commenté par wisbucky :

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

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

Avec Git 2.26 (Q1 2020), vous pouvez ajouter l' --show-scopeoption :

git config -l --show-origin --show-scope
VonC
la source
1
Dieu merci. Tant d'articles différents en ligne pour deviner où les configs git ont pu être stockées. Tous les articles ont manqué un emplacement possible sur ma machine: c: \ programdata \ git \ config. Je ne sais pas pourquoi il est là, mais je soupçonne l'intégration TFS de Visual Studio. Les autres endroits étranges que je passe beaucoup trop de temps à chercher étaient: C: \ program files \ mingw64 \ etc \ .gitconfig et H: \. Gitconfig. Merci mon Dieu pour cette nouvelle commande. Jésus. Christ.
RMuesi
Je me demande pourquoi user.cmdline=trueest nécessaire pour --show-origintravailler? De plus, j'ai remarqué que cela --show-origindoit être immédiatement après configpour pouvoir travailler avec --getet --get-all. Alors ça devrait être... config --show-origin --get-all core.autocrlf
wisbucky
@wisbucky D'accord: je supprime le -c 'user.cmdline=true'bit, qui semble faire référence à la portée du test: github.com/git/git/blob/…
VonC
@wisbucky Et j'ai inclus votre exemple pour un paramètre.
VonC
@VonC, Ah semble être user.cmdline=truenécessaire dans Git 2.13, mais plus nécessaire dans Git 2.15.
wisbucky
10

Après avoir précédemment installé Git pour Windows et l'avoir ensuite désinstallé, j'ai trouvé qu'il y avait un fichier de configuration installé dans C:\Users\All Users\Git\configlequel se trouve un fichier de configuration au niveau du système qui persiste et affectera tous les futurs packages MinGW32 Git (dans mon cas, j'exécutais un MinGW32 portable Package Git fourni par mon entreprise). Quand j'ai couru

git config --system --edit

il me montrerait le fichier de configuration système situé à mingw32/etc/gitconfig, mais il chargerait toujours les valeurs du premier emplacement également. Cela s'est révélé comme un avertissement indiquant que les valeurs de configuration entraient en conflit lors de la tentative d'utilisation de 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"

(Remarque: cela peut également être une situation où les avertissements LFS sont trop affirmés, # 861 )

jinxcat2008
la source
Ceci est très utile. N'aurait jamais trouvé ce fichier chez Tous les utilisateurs. Qu'est-ce que vous en avez fait?
T3rm1 le
1
J'ai supprimé les dossiers 'Git' de C: \ Users \ All Users \ (un alias de C: \ ProgramData) et C: \ Users \ foo \ AppData \ Local \ Programs \ qui ont supprimé tous les fichiers de configuration restants.
jinxcat2008
3

Vous pouvez utiliser --show-originpour savoir d'où viennent les configurations.

Priorité des fichiers de configuration dans Git pour Windows:

...

$PROGRAMDATA/Git/config::
(Windows uniquement) Fichier de configuration à l'échelle du système partagé avec d'autres implémentations Git. En règle générale les $PROGRAMDATA points à C:\ProgramData.

$(prefix)/etc/gitconfig::
Fichier de configuration à l'échelle du système. (Windows uniquement) Ce fichier contient uniquement les paramètres spécifiques à cette installation de Git pour Windows et qui ne doivent pas être partagés avec d'autres implémentations Git comme JGit, libgit2. --systemsélectionnera ce fichier.

$XDG_CONFIG_HOME/git/config::
Deuxième fichier de configuration spécifique à l'utilisateur. Si $XDG_CONFIG_HOMEn'est pas défini ou vide, $HOME/.config/git/configsera utilisé. Toute variable à valeur unique définie dans ce fichier sera écrasée par tout ce qui se trouve dans ~/.gitconfig. C'est une bonne idée de ne pas créer ce fichier si vous utilisez parfois des versions plus anciennes de Git, car la prise en charge de ce fichier a été ajoutée assez récemment.

~/.gitconfig::
Fichier de configuration spécifique à l'utilisateur. Aussi appelé fichier de configuration "global".

$GIT_DIR/config::
Fichier de configuration spécifique au référentiel.

...

Les fichiers sont lus dans l'ordre indiqué ci-dessus, la dernière valeur trouvée ayant priorité sur les valeurs lues précédemment.

...

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

$PROGRAMDATAest une variable d'environnement. Vous pouvez obtenir la valeur de ces variables comme ceci:

Dans Git Bash, vous devez utiliser echo "$ProgramData". Dans CMD, vous devez utiliser echo %PROGRAMDATA%. Notez que Git Bash prétend apparemment que les variables d'environnement sont sensibles à la casse.

C'est quoi $(prefix)?

Le préfixe est le répertoire de niveau supérieur dans lequel les éléments sont installés. Dans Git pour Windows, c'est soit <some-path>/mingw64ou <some-path>/mingw32.

Ini
la source
3

git config -l affiche toutes les valeurs héritées du système, global et local.

Vous avez donc un autre fichier de configuration quelque part qui est chargé avec votre .gitconfigfichier défini par l' utilisateur.

CBIII
la source
Merci, votre réponse m'a éclairé sur la différence entre système et global. La réponse de @ Cupcake avec les indicateurs --system m'a aidé à trouver le fichier.
RyanW
2

Une réponse complète pour Windows (c'est-à-dire une version Windows de la réponse acceptée):

Comme Linux, Windows a quatre niveaux de fichiers / paramètres de configuration et trois sont des équivalents directs. La chose importante à noter est l'autre - celle `` Toutes les applications / utilisateurs '' - d'autant plus que c'est là que le programme d'installation définit les valeurs, par exemple `` core.autocrlf = true '', et pourtant elle n'est pas accessible à partir de la ligne de commande donc cela sème la confusion.

Toutes les applications et utilisateurs

C'est comme une version partagée des paramètres «système» au cas où plusieurs applications Git seraient installées. Il n'y a pas de commande 'git config' pour y accéder, mais elles ont toujours un impact sur le résultat net pour un paramètre.

Emplacement du fichier de configuration:

C: \ ProgramData \ Git \ config

(Notez que «ProgramData» était «Tous les utilisateurs» sur les anciennes versions de Windows.)

Système

Emplacement du fichier de configuration: C: / Program Files / Git / mingw64 / etc / gitconfig

$ git config --system --list

Utilisateur

Emplacement du fichier de configuration:% USERPROFILE% .gitconfig (Cela se résout en 'C: / Users / <username>')

$ git config --global --list

Dépôt

Emplacement du fichier de configuration: [répertoire du référentiel actuel] /. Git / config

$ git config --local --list
À M
la source
2

En plus de git config -l --show-origin, que j'ai présenté ici , avec git 2.8 (mars 2016), vous l'avez maintenant, avec Git 2.26 (Q1 2020)

git config -l --show-scope

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

git config appris à montrer dans quel "scope ", en plus de quel fichier, chaque paramètre de configuration provient.

Voir commit 145d59f , commit 9a83d08 , commit e37efa4 , commit 5c105a8 , commit 6766e41 , commit 6dc905d , commit a5cb420 (10 février 2020) et commit 417be08 , commit 3de7ee3 , commit 329e6ec (24 janvier 2020) par Matthew Rogers ( ROGERSM94) .
(Fusionné par Junio ​​C Hamano - gitster- in commit 5d55554 , 17 fév 2020)

config: ajoutez '--show-scope' pour afficher la portée d'une valeur de configuration

Signé par: Matthew Rogers

Lorsqu'un utilisateur interroge les valeurs de configuration avec --show-origin, il est souvent difficile de déterminer la valeur réelle " scope" ( local,global , etc.) d'une valeur donnée est basée uniquement sur le fichier d'origine.

Enseigner 'git config' the '--show-scope option ' pour afficher la portée de toutes les valeurs de configuration affichées.

Notez que nous ne devrions jamais rien voir de portée "sous-module" car cela n'est utilisé que submodule-config.clors de l'analyse du fichier ".gitmodules".

Exemple:

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
la source
1

Sous Windows 7 (peut-être identique ou similaire pour Windows 10), pour Visual Studio et la ligne de commande Git, votre configuration globale est dans:

%USERPROFILE%\.gitconfig

(le point est devant le nom du fichier)

Mais cela n'est pas honoré par Sourcetree, du moins en mode Git Embedded, et la configuration est en:

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

(pas de point devant le nom du fichier)

(J'avais besoin de mettre à jour les deux fichiers pour modifier mes paramètres Git globaux pour la commande Git et Sourcetree.)

Une autre partie amusante. La configuration des hooks Git fonctionnait à partir de l' AppData\Local\...emplacement, mais après plus de recherche via Process Monitor , j'ai remarqué que Sourcetree charge également le lecteur global à partir du lecteur mappé de l'entreprise pour mon utilisateur.

Cela n'a pas de sens car très peu d'applications recherchent cet emplacement, mais Sourcetree le fait d'une manière ou d'une autre, donc si vous ne pouvez pas le faire fonctionner par paramètres d'emplacement sur Sourcetree, exécutez Process Monitor et créez une règle pour enregistrer uniquement le chemin contenant gitconfig, et vous peut trouver où se trouve réellement votre configuration globale dans le cas d'un répertoire d'utilisateurs mappé sur le réseau.

Et ce n'est peut-être même pas la faute de Sourcetree, comme je vois maintenant en écrivant ceci que git.exe charge cela, mais cela ne se produit que pour git.exe exécuté par Sourcetree, alors qu'une ligne de commande directe Git utilise %USERPROFILE%\.gitconfig

Entrez la description de l'image ici

Enfin, j'ai pris tous les résultats de Process Monitor, je les ai introduits dans SQL Server et j'ai exécuté une requête pour obtenir des résultats distincts (aucun ordre d'exécution particulier juste trié par chemin):

Entrez la description de l'image ici

Je ne sais pas comment ces configurations se rapportent les unes aux autres, mais je sais que certaines remplacent un autre certains paramètres fonctionnent d'un endroit à un autre.

Et la liste ci-dessus est invoquée par Sourcetree , encore une fois, une ligne de commande directe avec Git semble fonctionner correctement , %USERPROFILE%\.gitconfiget ce n'est pas sur cette liste, mais cela ressemblerait à ceci (sur Windows 7)C:\Users\pawel.cioch\.gitconfig

Pawel Cioch
la source
-1

Si vous voulez trouver pour trouver l'emplacement réel du fichier, il sera dans votre répertoire personnel.

Il est masqué et précédé d'un ".".

Donc, si vous êtes sur un Mac, dans votre terminal, vous pouvez cd ~ && open .gitconfigou l'ouvrir avec votre éditeur de texte préféré, par exemple cd ~ && atom .gitconfig.

AshNaz87
la source
1
Cela a déjà été dit. Inutile d'ajouter de la confusion en suggérant une (non) alternative.
Stim