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


Dans mon ~/.gitconfig, Je liste mon adresse e-mail personnelle sous [user], puisque c'est ce que je veux utiliser pour les pensions Github.

Mais, j'ai récemment commencé à utiliser git pour le travail, aussi. Le git repo de ma compagnie me permet de commettre, mais quand il envoie des annonces de nouveaux changesets, il dit qu'ils sont d'Anonymous parce qu'il ne reconnaît pas l'adresse e-mail dans mon .gitconfig Au moins, c'est ma théorie.

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


503
2017-11-18 22:45


origine


Réponses:


Vous pouvez configurer un référentiel individuel pour utiliser une adresse utilisateur / e-mail spécifique qui remplace la configuration globale. De la racine du repo, courir

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

732
2017-11-18 22:56



Depuis git 2,13, il est possible de résoudre cela en utilisant nouvellement introduit Inclusion conditionnelle.

Un exemple:

Configuration globale ~ / .gitconfig

[user]
    name = John Doe
    email = john@doe.tld

[includeIf "gitdir:~/work/"]
    path = ~/work/.gitconfig

Configuration spécifique au travail ~ / travail / .gitconfig

[user]
    email = john.doe@company.tld

158
2018-04-27 09:40



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

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

91
2018-04-12 11:03



Après avoir été inspiré par Le blog d'Orr Sella J'ai écrit un hook pré-commit (réside dans ~/.git/templates/hooks) qui définirait des noms d'utilisateur et des adresses e-mail spécifiques en fonction des informations contenues dans un référentiel local. ./.git/config:

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

[init]
    templatedir = ~/.git/templates

Alors chacun git init ou git clone va prendre ce crochet et va appliquer les données de l'utilisateur au cours de la prochaine git commit. Si vous voulez appliquer le hook aux dépôts déjà existants, exécutez simplement un git init à l'intérieur du repo afin de le réinitialiser.

Voici le crochet que j'ai trouvé (il a encore besoin d'être poli - les suggestions sont les bienvenues). Enregistrez-le en tant que

~/.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

MODIFIER:

J'ai donc réécrit le hook comme un hook et une commande en Python. De plus, il est possible d'appeler le script en tant que commande Git (git passport), aussi. Il est également possible de définir un nombre arbitraire d’ID à l’intérieur d’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 identités / utilisateurs de comptes Git.


33
2018-04-16 10:37



Si vous ne souhaitez pas avoir d'adresse e-mail par défaut (liens d'adresse e-mail à un utilisateur github), vous pouvez configurer que vous voulez être demandé. Comment vous pouvez faire cela dépend de la version de git que vous utilisez, voir ci-dessous.

L'inconvénient (prévu) est que vous devez configurer votre adresse e-mail (et votre nom) une fois pour chaque référentiel. Donc, vous ne pouvez pas oublier de le faire.

Version <2.7.0

[user]
    name = Your name
    email = "(none)"

dans votre configuration globale ~/.gitconfig comme indiqué dans un commentaire de Dan Aloni dans Le blog d'Orr Sella. En essayant de faire le premier commit dans un dépôt, git échoue avec le bon message:

*** Please tell me who you are.

Run

  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"

to set your account's default identity.
Omit --global to set the identity only in this repository.

fatal: unable to auto-detect email address (got '(none)')

Le nom provient de la configuration globale lorsque l'adresse e-mail est définie localement (le message n'est pas parfaitement précis).

2.7.0 ≤ Version <2.8.0

Le comportement dans les versions <2.7.0 n'était pas prévu et corrigé avec 2.7.0. Vous pouvez toujours utiliser un hook de pré-validation comme décrit dans Le blog d'Orr Sella. Cette solution fonctionne également pour d’autres versions, mais pas pour cette version.

Version ≥ 2.8.0

Dan Aloni ajouté une option pour réaliser ce comportement (voir notes de version). Utilisez-le avec:

[user]
    useConfigOnly = true

Pour le faire fonctionner, vous ne pouvez pas donner un nom ou une adresse e-mail dans la configuration globale. Ensuite, au premier commit, vous obtenez un message d'erreur

fatal: user.useConfigOnly set but no name given

Le message n'est donc pas très instructif, mais comme vous définissez explicitement l'option, vous devez savoir quoi faire. Contrairement à la solution des versions <2.7.0, vous devez toujours définir manuellement le nom et l’email.


22
2017-08-20 17:03



Une commande de comptes github basculer

Cette solution prend la forme d'un seul alias git. Une fois exécuté, l'utilisateur actuel du projet sera attaché à un autre compte

Générer des clés ssh

ssh-keygen -t rsa -C "rinquin.arnaud@gmail.com" -f '/Users/arnaudrinquin/.ssh/id_rsa'

[...]

ssh-keygen -t rsa -C "arnaud.rinquin@wopata.com" -f '/Users/arnaudrinquin/.ssh/id_rsa_pro'

Associez-les à vos comptes GitHub / Bitbucket

  1. copier la clé publique par défaut pbcopy < ~/.ssh/id_rsa.pub
  2. connectez-vous à votre compte GitHub
  3. coller la clé dans le add SSH key page github
  4. copier une autre clé publique pbcopy < ~/.ssh/id_rsa_pro.pub
  5. répétez et adaptez les étapes 2 à 4 pour tous les autres comptes

Étape 1. Commutation automatique de la clé ssh.

Nous pouvons configurer ssh pour envoyer une clé de chiffrement spécifique en fonction de la host. La bonne chose est que vous pouvez avoir plusieurs alias pour le même hostname.

Voir cet exemple ~/.ssh/config fichier:

# Default GitHub
Host github.com
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa

# Professional github alias
Host github_pro
  HostName github.com
  User git
  IdentityFile ~/.ssh/id_rsa_pro

git configuration à distance

Vous pouvez maintenant utiliser ces alias dans les télécommandes Git en changeant git@github.com par git@github_pro.

Vous pouvez soit changer vos télécommandes de projets existants (en utilisant quelque chose comme git remote origin set-url git@github_pro:foo/bar.git) ou les adapter directement lors du clonage.

git clone git@github.com:ArnaudRinquin/atom-zentabs.git

en utilisant l'alias, cela devient:

git clone git@github_pro:ArnaudRinquin/atom-zentabs.git

Étape 2. Changer git user.email

Les paramètres de configuration Git peuvent être globaux ou par projet. Dans notre cas, nous voulons un paramètre par projet. C'est très facile de le changer:

git config user.email 'arnaud.rinquin@wopata.com'

Bien que ce soit facile, les développeurs sont longs. Nous pouvons écrire un alias git très simple pour cela.

Nous allons l'ajouter à la ~/.gitconfig fichier.

[user]
    name = Arnaud Rinquin
    email = rinquin.arnaud@gmail.com

...

[alias]
    setpromail = "config user.email 'arnaud.rinquin@wopata.com'"

Ensuite, tout ce que nous avons à faire est git setpromail Avoir notre email changé pour ce projet seulement.

Étape 3. Un interrupteur de commande s'il vous plaît ?!

Ne serait-il pas intéressant de passer d'un compte par défaut à un compte spécifié avec une seule commande sans paramètre? Ceci est certainement possible. Cette commande aura deux étapes:

  • changer les télécommandes de projet actuelles pour les alias choisis
  • modifier le projet en cours user.email config

Nous avons déjà une solution à une commande pour la deuxième étape, mais la première est beaucoup plus difficile. Un changement d'hôte distant de commande

Voici la solution sous la forme d'une autre commande alias git à ajouter à votre ~/.gitconfig:

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"

Cela permet de changer toutes les télécommandes d'un hôte à un autre (l'alias). Voir l'exemple:

$ > git remote -v
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github.com:ArnaudRinquin/arnaudrinquin.github.io.git (push)

$ > git changeremotehost github.com github_pro

$ > git remote -v
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (fetch)
origin  git@github_pro:ArnaudRinquin/arnaudrinquin.github.io.git (push)

Combinez-les tous

Il suffit maintenant de combiner les deux commandes en une, c'est assez facile. Voyez comment j'intègre également la commutation d'hôte bitbucket.

[alias]
  changeremotehost = !sh -c \"git remote -v | grep '$1.*fetch' | sed s/..fetch.// | sed s/$1/$2/ | xargs git remote set-url\"
  setpromail = "config user.email 'arnaud.rinquin@wopata.com'"
  gopro = !sh -c \"git changeremotehost github.com github_pro && git changeremotehost bitbucket.com bitbucket_pro && git setpromail\"

Lien source -Tutoriel


21
2017-10-12 10:37



Une autre option pour obtenir git travailler avec plusieurs noms / emails est par aliasing git et en utilisant le -c flag pour remplacer la configuration globale et spécifique au référentiel.

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, tapez simplement git config user.email:

$ git config user.email
name@example.com

Au lieu d'un alias, vous pouvez également mettre une coutume git exécutable dans votre $PATH.

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

Un avantage de ces méthodes par rapport à un référentiel spécifique .git/config est que cela s'applique à tous git référentiel lorsque la coutume git le programme est actif. De cette façon, vous pouvez facilement basculer entre les utilisateurs / noms sans modifier aucune configuration (partagée).


16
2017-10-02 21:41