La configuration git peut-elle être définie sur plusieurs référentiels?

Git semble prendre en charge les valeurs de configuration à trois niveaux:

  • Paramètres globaux par système (stockés dans /etc/git-core )
  • Paramètres globaux par user (stockés dans ~/.gitconfig )
  • Paramètres locaux par référentiel (stockés dans $REPO/.git/config )

Ces options couvrent la plupart des bases, mais je cherche un moyen de gérer un quasortingème niveau. J'ai une (très) grande collection de repositorys pour lesquels j'ai besoin d'utiliser une valeur différente pour user.email que mon habituel. Ces référentiels sont souvent créés et manipulés via des scripts automatisés, et la configuration par parameters locaux du référentiel est fastidieuse.

Tous les référentiels en question sont situés sous un certain préfixe de path sur mon système local. Existe-t-il un moyen de définir une valeur de configuration quelque part qui sera héritée par tous les référentiels sous ce path? (Un peu comme .htaccess parameters .htaccess héritent tout le long du système de files.) Peut-être y aurait-il un moyen de définir des valeurs conditionnelles dans le file de configuration global? Quelles autres dispositions pourraient être sockets dans un environnement UNIX pour faire face à un set de référentiels comme le mien?

Je n'ai trouvé aucun moyen de configurer git à ce quasortingème niveau. Le seul moyen semble être la substitution de la valeur de configuration par command en utilisant git -c key=value .

Ma solution hacky actuelle est de définir une fonction shell qui sert de wrapper pour git. Lorsqu'elle est appelée, elle transmet les arguments à la command system git, mais pas avant de vérifier le directory de travail actuel et d'append un argument supplémentaire à la command le cas échéant.

 function git () { case "$PWD" in /path/to/repos/*) command git -c [email protected] "$@" ;; *) command git "$@" ;; esac } 

Vous pouvez configurer l'adresse e-mail de git avec la variable d'environnement GIT_AUTHOR_EMAIL . Si vous combinez ceci avec Execute bash scripts lors de la saisie d'un directory ou d' une configuration de shell spécifique à zsh, vous pouvez facilement changer les parameters par directory ou parent, par exemple si vous entrez un directory dans ~/work changez votre adresse e-mail.

Sur la base de la réponse de Caleb, nous pouvons définir une command git modifiée qui configure en permanence tous les référentiels de ce directory, de sorte que toutes les utilisations futures de vanilla git utiliseront la nouvelle configuration. J'utilise le hub , qui est un autre wrapper git, donc j'ai remplacé mon alias git=hub par celui-ci et appelé hub dans ma fonction – si vous n'utilisez pas hub , remplacez toutes les invocations de hub par la command git :

 function git() { case "$PWD" in /home/robin/git/3RD_PARTY) hub "$@" # We don't know which repository was cloned / operated on, so let's just reconfigure them all for f in *; do [[ -d "$f" ]] && hub -C "$f" config user.email $my_private_email done ;; /home/robin/git/3RD_PARTY/*) hub "$@" hub config user.email $my_private_email ;; *) hub "$@" ;; esac } 

Contrairement à la réponse de Caleb, qui ne fonctionne que dans un shell (et à less que cela ne soit explicitement source, uniquement dans un shell interactif), cela affecte également les autres frontaux git qui lisent correctement la config git, comme emacs magit.