1053 votes

Puis-je spécifier plusieurs utilisateurs pour moi-même dans .gitconfig ?

Dans mon ~/.gitconfig j'indique mon adresse électronique personnelle sous [user] puisque c'est ce que je veux utiliser pour les dépôts Github.

Mais, j'ai récemment commencé à utiliser git pour le travail, aussi. Le repo git de mon entreprise me permet de commiter, mais lorsqu'il envoie des annonces de nouvelles modifications, il indique qu'elles proviennent d'un anonyme parce qu'il ne reconnaît pas l'adresse de courriel dans mon compte git. .gitconfig - du moins, c'est ma théorie.

Est-il possible de spécifier plusieurs [user] définitions dans .gitconfig ? Ou bien existe-t-il un autre moyen de remplacer le système par défaut ? .gitconfig pour un certain répertoire ? Dans mon cas, je vérifie tout le code de travail dans ~/worksrc/ - existe-t-il un moyen de spécifier un .gitconfig pour ce seul répertoire (et ses sous-répertoires) ?

0 votes

1 votes

Je suis surpris que le serveur de votre entreprise fasse cela - il faudrait qu'il CHANGE le sha de votre commit pour que cela fonctionne. Si vous faites un commit sur un checkout local, quel nom d'utilisateur voyez-vous ?

0 votes

@Alex : On peut supposer que le crochet de notification essaie de faire correspondre les informations sur l'auteur (email, peut-être) avec une autre liste/base de données, peut-être pour la canoniser, peut-être pour rechercher d'autres informations. Il est évident que ce n'est pas la meilleure approche pour ce cas particulier, cependant !

1302voto

discomurray Points 2736

Vous pouvez configurer un repo individuel pour qu'il utilise un utilisateur / une adresse électronique spécifique, ce qui a priorité sur la configuration globale. A partir de la racine du repo, exécutez

git config user.name "Your Name Here"
git config user.email your@email.com

alors que l'utilisateur / email par défaut est configuré dans votre ~/.gitconfig

git config --global user.name "Your Name Here"
git config --global user.email your@email.com

110 votes

Vous pouvez voir les effets de ces paramètres dans l'onglet .git/config fichier

0 votes

J'ai essayé au travail de spécifier mon nom/email spécifique au travail, mais il semble que je reçoive toujours des emails sur mon compte personnel que j'ai lié à la commande --global git. Je n'ai jamais utilisé cette fonctionnalité auparavant, mais devrait-elle envoyer un courriel (s'il y en a un) au premier utilisateur.email trouvé et non pas à la commande --global ? Cela prend-il un certain temps une fois que j'ai défini le nom/email de l'utilisateur local ou cela devrait-il être instantané ?

0 votes

123voto

Rahul Prasad Points 1411

Ou vous pouvez ajouter les informations suivantes dans votre local .git/config fichier

[user]  
    name = Your Name
    email = your.email@gmail.com

33 votes

...qui est la façon manuelle de faire ce que les commandes recommandées par @discomurray font pour vous.

5 votes

Est-il possible d'ajouter plusieurs lignes de ce type par télécommande ?

46voto

Saucier Points 1238

Après s'être inspiré de Article de blog d'Orr Sella J'ai écrit un hook pre-commit (résidant dans ~/.git/templates/hooks ) qui définirait des noms d'utilisateur et des adresses électroniques spécifiques sur la base des informations contenues dans la base de données des dépôts locaux. ./.git/config :

Vous devez placer le chemin d'accès au répertoire du modèle dans votre fichier de configuration. ~/.gitconfig :

[init]
    templatedir = ~/.git/templates

Ensuite, chaque git init o git clone reprendra ce crochet et appliquera les données de l'utilisateur lors de la prochaine git commit . Si vous voulez appliquer le crochet à des dépôts déjà existants, il suffit de lancer une commande git init à l'intérieur du repo afin de le réinitialiser.

Voici l'accroche que j'ai trouvée (elle doit encore être peaufinée - les suggestions sont les bienvenues). Enregistrez-la soit comme

~/.git/templates/hooks/pre_commit

ou

~/.git/templates/hooks/post-checkout

et assurez-vous qu'il est exécutable : chmod +x ./post-checkout || chmod +x ./pre_commit

#!/usr/bin/env bash

# -------- USER CONFIG
# Patterns to match a repo's "remote.origin.url" - beginning portion of the hostname
git_remotes[0]="Github"
git_remotes[1]="Gitlab"

# Adjust names and e-mail addresses
local_id_0[0]="my_name_0"
local_id_0[1]="my_email_0"

local_id_1[0]="my_name_1"
local_id_1[1]="my_email_1"

local_fallback_id[0]="${local_id_0[0]}"
local_fallback_id[1]="${local_id_0[1]}"

# -------- FUNCTIONS
setIdentity()
{
    local current_id local_id

    current_id[0]="$(git config --get --local user.name)"
    current_id[1]="$(git config --get --local user.email)"

    local_id=("$@")

    if [[ "${current_id[0]}" == "${local_id[0]}" &&
          "${current_id[1]}" == "${local_id[1]}" ]]; then
        printf " Local identity is:\n"
        printf "»  User: %s\n»  Mail: %s\n\n" "${current_id[@]}"
    else
        printf "»  User: %s\n»  Mail: %s\n\n" "${local_id[@]}"
        git config --local user.name "${local_id[0]}"
        git config --local user.email "${local_id[1]}"
    fi

    return 0
}

# -------- IMPLEMENTATION
current_remote_url="$(git config --get --local remote.origin.url)"

if [[ "$current_remote_url" ]]; then

    for service in "${git_remotes[@]}"; do

        # Disable case sensitivity for regex matching
        shopt -s nocasematch

        if [[ "$current_remote_url" =~ $service ]]; then
            case "$service" in

                "${git_remotes[0]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[0]}"
                    setIdentity "${local_id_0[@]}"
                    exit 0
                    ;;

                "${git_remotes[1]}" )
                    printf "\n»» An Intermission\n»  %s repository found." "${git_remotes[1]}"
                    setIdentity "${local_id_1[@]}"
                    exit 0
                    ;;

                * )
                    printf "\n»  pre-commit hook: unknown error\n» Quitting.\n"
                    exit 1
                    ;;

            esac
        fi
    done
else
    printf "\n»» An Intermission\n»  No remote repository set. Using local fallback identity:\n"
    printf "»  User: %s\n»  Mail: %s\n\n" "${local_fallback_id[@]}"

    # Get the user's attention for a second
    sleep 1

    git config --local user.name "${local_fallback_id[0]}"
    git config --local user.email "${local_fallback_id[1]}"
fi

exit 0

EDITAR:

J'ai donc réécrit le hook comme un hook et une commande en Python. De plus, il est possible d'appeler le script comme une commande Git ( git passport ), également. Il est également possible de définir un nombre arbitraire d'IDs dans un fichier de configuration ( ~/.gitpassport ) qui sont sélectionnables sur une invite. Vous pouvez trouver le projet sur github.com : git-passport - Une commande et un hook Git écrits en Python pour gérer plusieurs comptes Git / identités d'utilisateur .

1 votes

Cela fonctionne parfaitement. Cependant, j'ai obtenu de meilleurs résultats en faisant de ce crochet un crochet post-checkout (au lieu de post-commit). Mes suggestions pour améliorer cette réponse sont, mentionner que : 1. le snippet doit être sauvegardé en tant que ~/.git/templates/hooks/post-checkout et avoir une permission chmod +x post-checkout , 2. git_remotes Les valeurs sont des portions de début de nom d'hôte complet, par ex. git@github.com , 3. local_id Les valeurs doivent être éditées par l'utilisateur pour les noms et adresses électroniques respectifs.

0 votes

@ShantanuKumar Merci pour votre commentaire. J'ai ajusté la réponse comme vous l'avez proposé. Peut-être que je vais réécrire le script en Python bientôt.

0 votes

Ajout du support pour les expressions régulières et pour les dépôts sans remotes. Pour un téléchargement facile, tous les fichiers fusionnés aquí . Regexps pour distinguer les identités de différents projets sur un même service. Et la prise en charge des dépôts distants avec par exemple une identité par défaut a du sens si vous git init de nouveaux projets à partir d'un IDE tel que eclipse (qui ne peut pas gérer les déclencheurs interactifs de pré-commit)

18voto

Rob W Points 125904

Une autre option pour obtenir git pour travailler avec plusieurs noms/emails, il faut utiliser l'alias. git et en utilisant le -c pour remplacer la configuration globale et celle spécifique au dépôt.

Par exemple, en définissant un alias :

alias git='/usr/bin/git -c user.name="Your name" -c user.email="name@example.com"'

Pour voir si cela fonctionne, il suffit de taper git config user.email :

$ git config user.email
name@example.com

Au lieu d'un alias, vous pouvez également mettre un nom d'utilisateur personnalisé. git à l'intérieur de votre $PATH .

#!/bin/sh
/usr/bin/git -c user.name="Your name" -c user.email="name@example.com" "$@"

L'avantage de ces méthodes par rapport à une méthode spécifique au référentiel .git/config est qu'il s'applique à tous les git lorsque l'application personnalisée git est actif. De cette façon, vous pouvez facilement passer d'un utilisateur/nom à l'autre sans modifier la configuration (partagée).

5voto

Abhijeet B Points 82

Environnement Windows

Ce complément peut être modifié à partir de Git Extensions --> Settings --> Global Settings si vous l'avez installé sur vos systèmes.

gitextensions-latest-release

Cliquez avec le bouton droit de la souris sur un dossier/répertoire dans l'environnement Windows pour accéder à ces paramètres. enter image description here

Mise à jour : Comment changer/maintenir plusieurs paramètres dans la version 2.49 How to switch/maintain multiple settings in Version 2.49

0 votes

Comment cela concerne-t-il les utilisateurs multiples, au lieu de simplement les modifier ?

0 votes

@D_N Mise à jour avec une nouvelle capture d'écran avec des options pour changer les paramètres.

0 votes

Ouvrez le dossier repo local et sélectionnez git-config dans le menu de navigation puis cliquez sur l'onglet repo local, le contenu sera appliqué à $local_repo_path/.git/config comme la réponse ci-dessus.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X