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

18

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 utilisateur (stockés dans ~/.gitconfig)
  • Paramètres locaux par référentiel (stockés dans $REPO/.git/config)

Ces options couvrent la majeure partie de la base, mais je cherche un moyen de gérer un quatrième niveau. J'ai une (très) grande collection de référentiels pour lesquels j'ai besoin d'utiliser une valeur différente de user.emailcelle de mon habitude. Ces référentiels sont souvent créés et manipulés via des scripts automatisés, et la configuration des paramètres locaux par référentiel est fastidieuse.

Tous les référentiels en question sont situés sous un certain préfixe de chemin 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 chemin? (Une sorte de .htaccessparamètres similaires héritent tout le long du système de fichiers.) Peut-être y aurait-il un moyen de définir des valeurs conditionnelles dans le fichier de configuration global? Quelles autres dispositions pourraient être prises dans un environnement UNIX pour faire face à un ensemble de référentiels comme le mien?

Caleb
la source
Mon premier réflexe est de pirater les scripts à modifier .gitconfigdans chaque répertoire qu'ils créent. Par exemple, de IIRC Android repo peut le faire, mais vous devez lire attentivement la source de savoir. (Je ne suis pas complètement sûr, je n'ai pas fait ça depuis un moment.)
Gilles 'SO- arrête d'être méchant'
@ Gilles: C'est certainement une possibilité. Les référentiels en question sont le référentiel de packages pour une distribution Linux qui a récemment migré de CVS vers Git. Nous travaillons toujours à refaire tous nos outils. À long terme, c'est probablement là que cela se règle, mais à court terme, ceux d'entre nous qui y travaillons expérimentent les options.
Caleb

Réponses:

11

Je n'ai trouvé aucun moyen de configurer git à ce quatrième niveau. La seule façon semble être de remplacer les valeurs de configuration par commande en utilisantgit -c key=value .

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

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c user.email=alternate@credentials.org "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}
Caleb
la source
puis-je faire command git -c [email protected] user.name="Alter Ego" "$@"ou comment dois-je procéder? Recherche haut et bas et la seule référence à ce drapeau -c que j'ai trouvée était la vôtre, merci, très appréciée.
Vic Goldfeld
pour mémoire, je l'ai fait travailler aveccommand git -c [email protected] -c user.name="Alter Ego" "$@"
Vic Goldfeld
6

Vous pouvez configurer l'adresse e-mail de git avec la variable d'environnement GIT_AUTHOR_EMAIL. Si vous combinez cela avec des scripts bash d'exécution lors de la saisie d'un répertoire ou d' une configuration de shell spécifique à un répertoire avec zsh, vous pouvez facilement modifier les paramètres par répertoire ou répertoire parent, par exemple, si vous entrez dans un répertoire, ~/workvous pouvez ajuster automatiquement les variables d'environnement pour modifier votre adresse e-mail. adresse.

Ulrich Dangel
la source
1

Sur la base de la réponse de Caleb, nous pouvons définir une gitcommande modifiée qui configure correctement en permanence tous les référentiels de ce répertoire, afin que toutes les utilisations futures de vanilla git utilisent la nouvelle configuration. J'utilise hub, qui est un autre wrapper git, donc j'ai remplacé my alias git=hubpar ceci et appelé hubdans ma fonction - si vous n'utilisez pas hub, remplacez toutes les hubinvocations par 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 sauf explication d'origine, uniquement dans un shell interactif), cela affecte également d'autres frontaux git qui lisent correctement la configuration git, comme emacs magit.

Robin Green
la source