web-dev-qa-db-fra.com

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

J'ai remarqué que j'ai 2 annonces pour core.autocrlf quand je cours 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
[email protected]
core.autocrlf=true

Ces 3 derniers (de user.name down) sont les seuls dans mon c:\users\username\.gitconfig fichier. D'où viennent tous les autres? Pourquoi core.autocrlf est-il répertorié deux fois?

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

79
RyanW

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

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

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

  1. Configuration du système.
  2. Configuration utilisateur.
  3. Configuration spécifique au repo.

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/config Pour ce référentiel.

Si vous utilisez msysgit sous Windows, vous trouverez probablement votre fichier d'utilisateur ~/.gitconfig Dans lequel pointe toujours %homepath% Si vous utilisez echo %homepath% À partir d'une invite de commande Windows.

Depuis le documentation pour git config :

S'il n'est pas défini explicitement avec --file, Il existe quatre fichiers dans lesquels git config Recherchera 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_HOME N'est pas défini ou vide, $HOME/.config/git/config Sera 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 récemment.

  • ~/.gitconfig

    Fichier de configuration spécifique à l'utilisateur. Également 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 les fichiers disponibles. Si le fichier de configuration global ou global n'est pas disponible, ils seront ignorés. Si le fichier de configuration du référentiel n'est pas disponible ou lisible, git config Se terminera avec un code d'erreur différent de zéro. Cependant, dans aucun 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 sont utilisées.

Toutes les options d’écriture écrivent par défaut dans le fichier de configuration spécifique au référentiel. Notez que cela affecte également les options telles que --replace-all Et --unset. git config ne modifiera jamais qu'un fichier à la fois

Vous pouvez remplacer ces règles par des options de ligne de commande ou par des variables d'environnement. Les options --global Et --system Limitent le fichier utilisé au fichier global ou au fichier système. La variable d'environnement GIT_CONFIG A un effet similaire, mais vous pouvez spécifier le nom de fichier de votre choix.

93
user456814

Vous n'avez plus à deviner quelle configuration a été réglée sur où, avec git 2.8! (Mars 2016)

Voir commit 70ang79 , commit 473166b , commit 7454ee , commit 7454ee (19 février 2016), commit 473166b , commit 7454ee (19 février 2016), commit 7454ee (19 février 2016), et commit a0578e (17 février 2016 ) par Lars Schneider (larsxschneider) .
(Fusion par Junio ​​C Hamano - gitster - dans commit dd0f567 , 26 février 2016)

config: ajoute '--show-Origin 'option pour imprimer l'origine d'une valeur de configuration

Si les valeurs de configuration sont interrogées avec 'git config '(par exemple via --get, --get-all, --get-regexp, ou --list flag), il est parfois difficile de trouver le fichier de configuration dans lequel les valeurs ont été définies.

Apprendre 'git config' le '--show-Origin 'option pour imprimer le fichier de configuration source pour chaque valeur imprimée.

Le git config page de manuel indique 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 ou identifiant de blob, le cas échéant).

Par exemple:

git config --list --show-Origin

Cela va retourner:

    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
54
VonC

Après avoir précédemment installé Git pour Windows et l'avoir désinstallé par la suite, j'ai constaté qu'un fichier de configuration était installé à l'emplacement C:\Utilisateurs\Tous les utilisateurs\Git\config, qui est un fichier de configuration au niveau système qui persiste et affectera tous les futurs paquets mingw32 git (dans mon cas, j’exécutais un paquet portable mingw32 git fourni par ma société). Quand j'ai couru

git config --system --edit

il me montrerait le fichier de configuration du système situé dans mingw32/etc/gitconfig, mais chargerait également les valeurs à partir du premier emplacement. Cela s'est avéré être un avertissement que les valeurs de configuration se sont heurtées lorsque vous essayez d'utiliser 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: il peut également s'agir d'une situation dans laquelle les avertissements lfs sont trop affirmés # 861 )

10
jinxcat2008

Git config -l affiche toutes les valeurs héritées de: system, global et local.

Donc, vous avez un autre fichier de configuration quelque part qui est chargé avec votre .gitconfig défini par l'utilisateur

3
CBIII

Vous pouvez utiliser --show-Origin Pour savoir d'où proviennent les configurations.

Priorité des fichiers de configuration dans Git pour Windows:

...

$PROGRAMDATA/Git/config ::
(Windows uniquement) Fichier de configuration système partagé avec d'autres implémentations Git. Typiquement, $PROGRAMDATA Pointe sur C:\ProgramData.

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

$XDG_CONFIG_HOME/git/config ::
Deuxième fichier de configuration spécifique à l'utilisateur. Si $XDG_CONFIG_HOME N'est pas défini ou vide, $HOME/.config/git/config Sera 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 récemment.

~/.gitconfig ::
Fichier de configuration spécifique à l'utilisateur. Également 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

$PROGRAMDATA Est 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.

Qu'est-ce que $(prefix)?

Le préfixe est le répertoire de niveau supérieur dans lequel les choses sont installées. Dans Git pour Windows, il s’agit de <some-path>/mingw64 Ou de <some-path>/mingw32.

2
Ini

J'ajoute une autre réponse car je ne pense pas qu'il existe 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 - l’application "Toutes les applications/tous les utilisateurs", d’autant plus que c’est là que l’installateur définit les valeurs, par exemple. 'core.autocrlf = true' et pourtant, il n'est pas accessible depuis la ligne de commande, ce qui crée une confusion.

Toutes les applications/utilisateurs

Cela ressemble à une version partagée des paramètres ‘système’ si plusieurs applications git sont installées. Il n'y a pas de commande 'git config' pour accéder à ceux-ci mais ils 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

tilisateur

Emplacement du fichier de configuration:
% USERPROFILE% .gitconfig
(Cela résout c:/Users/')

$ git config --global --list

Repo

Emplacement du fichier de configuration:
[répertoire du dépôt actuel] /. git/config

$ git config --local --list

1
Tom

Sous Windows 7 (identique ou similaire pour Windows 10) pour Visual Studio et la ligne de commande git, votre configuration globale est en

%USERPROFILE%\.gitconfig

(le point est devant le fichier)

mais ceci n’est pas respecté 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 fichier)

[J'avais besoin de mettre à jour les deux fichiers pour modifier mes paramètres globaux git pour la commande git et SourceTree]

Une autre partie amusante. Git hooks config fonctionnait à partir du AppData\Local\... _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ I Page\'? Cela a très peu de sens car très peu d'applications recherchent cet emplacement. ST ne le fait pas si vous ne pouvez pas utiliser les paramètres par emplacement sur ST, exécutez procmon.exe et créez une règle pour consigner uniquement le chemin contenant gitconfig. où se trouve vraiment votre conf globale en cas de répertoire utilisateur mappé sur le réseau. Et cela n’est peut-être même pas la faute de ST, comme je le vois maintenant en écrivant que git.exe est en train de charger cela, mais cela ne se produit que pour git.exe exécuté par ST, alors que la ligne de commande directe git utilise %USERPROFILE%\.gitconfig

enter image description here

Enfin, j'ai pris tous les résultats de procmon, alimenté en SQL et lancé une requête pour obtenir des résultats distincts (aucun ordre d'exécution particulier trié par chemin):

enter image description here

Je ne sais pas comment ces configurations se rapportent les unes aux autres, mais je sais que certaines remplacent d'autres, certains paramètres fonctionnent d'un emplacement à un autre. Et la liste ci-dessus est invoquée par SourceTree , encore une fois, la ligne de commande directe avec git semble bien fonctionner avec %USERPROFILE%\.gitconfig et cela ne figure pas dans cette liste, mais ressemblerait à ceci (sous Win7) c:\Users\pawel.cioch\.gitconfig

0
Pawel Cioch