Comment dire à git d'utiliser la bonne identité (nom et email) pour un projet donné?


117

J'utilise mon ordinateur portable personnel pour des projets professionnels et personnels et j'aimerais utiliser mon adresse e-mail professionnelle pour mes commits au travail (gitolite) et mon adresse e-mail personnelle pour le reste (github).

J'ai lu les solutions suivantes qui sont toutes globales ou temporaires:

  • git config --global user.email "bob@example.com"
  • git config user.email "bob@example.com"
  • git commit --author "Bob <bob@example.com>"
  • définition de l'une des variables d'environnement GIT_AUTHOR_EMAIL, GIT_COMMITTER_EMAILouEMAIL

Une solution consiste à exécuter manuellement une fonction shell qui définit mon environnement de travail ou personnel , mais je suis presque sûr que j'oublierai souvent de passer à la bonne identité, ce qui entraînera une validation sous la mauvaise identité.

Existe-t-il un moyen de lier un certain référentiel, un nom de projet, etc. à une identité (nom, email)? Que font les gens?


1
Je vous demande d’accepter l’une des réponses. J'espère que l'un d'eux doit vous avoir aidé à résoudre votre problème.
RBT

Réponses:


134

git config user.email "bob@example.com"

Faire cela à l'intérieur d'un dépôt définira la configuration sur CE dépôt, et pas globalement.

On dirait que c'est à peu près ce que vous recherchez, sauf si je vous interprète mal.


Je suppose que cela devrait le faire. Je m'attends à avoir plusieurs référentiels locaux pour un même projet, notamment afin de basculer plus facilement entre les branches sans avoir à tout recompiler. C'est peut-être juste une mauvaise habitude svn. Merci.
Martin Jambon

1
@ Martin - Je n'utilise pas git depuis très longtemps, mais j'ai l'impression que l'utilisation de plusieurs dépôts locaux serait un flux de travail inhabituel pour git. Même dans ce cas, vous n'avez besoin de l'exécuter qu'une seule fois sur une instance du dépôt, et il est défini pour la durée de vie de ce dépôt, donc ce n'est pas si mal.
Dan Ray

@DanRay Il s'agit en fait d'une configuration courante si, comme dans le cas de Martin, le dépôt local a des fichiers locaux non validés. Passer d'une branche à une autre ne reconstruirait pas automatiquement les fichiers. Si éviter de «tout recompiler» est un objectif, utiliser plusieurs dépôts locaux est la bonne façon de le faire.
dolmen

1
git config --global user.email "bob@example.com" L'ajout de --global permet de le faire fonctionner dans tous les dépôts. source: help.github.com/articles/setting-your-username-in-git
SashiOno

1
Il s'agit d'une tâche manuelle et peut être oubliée. Des solutions automatiques sont suggérées par @ dragon788 et moi
naitsirch

47

Vous devez utiliser la commande set locale ci-dessous:

ensemble local

git config user.email mahmoud@company.ccc
git config user.name 'Mahmoud Zalt'

local get

git config --get user.email
git config --get user.name

Le fichier de configuration local est dans le répertoire du projet: .git/config.

ensemble global

git config --global user.email mahmoud@zalt.me
git config --global user.name 'Mahmoud Zalt'

global get

git config --global --get user.email
git config --global --get user.name

Le fichier de configuration globale dans votre répertoire personnel: ~/.gitconfig.

N'oubliez pas de citer des espaces, etc., par exemple: 'FirstName LastName'


23

Modifiez le fichier de configuration dans le dossier ".git" pour conserver les différents nom d'utilisateur et e-mail dépend du référentiel

  • Accédez à votre référentiel
  • Afficher les fichiers cachés et aller dans le dossier ".git"
  • Trouvez le fichier "config"
  • Ajoutez les lignes ci-dessous à EOF

[utilisateur]

nom = Bob

email = bob@example.com

La commande ci-dessous vous montre le nom d'utilisateur et l'adresse e-mail définis pour ce référentiel.

git config --get user.name

git config --get user.email

Exemple: pour le mien, ce fichier de configuration dans D: \ workspace \ eclipse \ ipchat \ .git \ config

Ici ipchat est le nom de mon dépôt


16

Si vous l'utilisez, git config user.email "foo@example.com"il sera lié au projet actuel dans lequel vous vous trouvez.

C'est ce que je fais pour mes projets. J'ai défini l'identité appropriée lorsque je cloné / initier le dépôt. Ce n'est pas infaillible (si vous oubliez et poussez avant de le comprendre, vous êtes arrosé) mais c'est à peu près aussi bon que vous pouvez obtenir sans la capacité de diregit config --global user.email 'ILLEGAL_VALUE'

En fait, vous pouvez créer une valeur illégale. Définissez votregit config --global user.name $(perl -e 'print "x"x968;')

Ensuite, si vous oubliez de définir vos valeurs non globales, vous obtiendrez un message d'erreur.

[EDIT] Sur un système différent, j'ai dû augmenter le nombre de x à 968 pour qu'il échoue avec "fatal: identifiant personnel incroyablement long". Même version de git. Étrange.


Cela semble être un excellent truc, mais cela n'a pas fonctionné pour moi. Le commit et le push vers gitolite remote ont réussi.
Martin Jambon

@Martin Jambon: étrange. J'utilise la version 1.7.4.5 de git
Seth Robertson

@Martin Jambon: Vous pouvez également essayer de définir votre nom d'utilisateur / adresse e-mail global sur "x". Certaines anciennes versions de git rejetaient des valeurs trop petites. Indiquez la version / os de git dont vous disposez si cela ne fonctionne pas.
Seth Robertson

@Martin Jambon: Essayez 968 "x" et voyez si cela fonctionne mieux pour vous.
Seth Robertson

8

Si vous n'utilisez pas le --globalparamètre, il définira les variables pour le projet en cours uniquement.


8

Depuis Git 2.13, vous pouvez utiliser un includeIfdans votre gitconfig pour inclure un fichier avec une configuration différente en fonction du chemin du référentiel où vous exécutez vos commandes git.

Depuis qu'un Git assez nouveau est livré avec Ubuntu 18.04, je l'utilise ~/.gitconfigavec plaisir.

[include]
  path = ~/.gitconfig.alias # I like to keep global aliases separate
  path = ~/.gitconfig.defaultusername # can maybe leave values unset/empty to get warned if a below path didn't match
# If using multiple identities can use per path user/email
# The trailing / is VERY important, git won't apply the config to subdirectories without it
[includeIf "gitdir:~/projects/azure/"]
  path = ~/.gitconfig.azure # user.name and user.email for Azure
[includeIf "gitdir:~/projects/gitlab/"]
  path = ~/.gitconfig.gitlab # user.name and user.email for GitLab
[includeIf "gitdir:~/projects/foss/"]
  path = ~/.gitconfig.github # user.name and user.email for GitHub

https://motowilliams.com/conditional-includes-for-git-config#disqus_thread

Pour utiliser Git 2.13, vous devrez soit ajouter un PPA (Ubuntu plus ancien que 18.04 / Debian) ou télécharger les binaires et installer (Windows / autre Linux).


Très utile et exactement ce que je cherchais. Combiné avec git config core.sshCommandplusieurs clés privées, offre une gestion complète et transparente des identités git.
jusqu'au

0

Une solution consiste à exécuter manuellement une fonction shell qui définit mon environnement de travail ou personnel, mais je suis presque sûr que j'oublierai souvent de passer à la bonne identité, ce qui entraînera une validation sous la mauvaise identité.

C'était exactement mon problème. J'ai écrit un script hook qui vous avertit si vous avez une télécommande github et que vous n'avez pas défini de nom d'utilisateur local.

Voici comment vous le configurez:

  1. Créer un répertoire pour contenir le hook global

    mkdir -p ~/.git-templates/hooks

  2. Dites à git de tout copier dans ~/.git-templatesvotre .gitrépertoire par projet lorsque vous exécutez git init ou clone

    git config --global init.templatedir '~/.git-templates'

  3. Et maintenant, copiez les lignes suivantes ~/.git-templates/hooks/pre-commitet rendez le fichier exécutable (n'oubliez pas ceci sinon git ne l'exécutera pas!)

#!/bin/bash

RED='\033[0;31m' # red color
NC='\033[0m' # no color

GITHUB_REMOTE=$(git remote -v | grep github.com)
LOCAL_USERNAME=$(git config --local user.name)

if [ -n "$GITHUB_REMOTE" ] && [ -z "$LOCAL_USERNAME" ]; then
    printf "\n${RED}ATTENTION: At least one Github remote repository is configured, but no local username. "
    printf "Please define a local username that matches your Github account.${NC} [pre-commit hook]\n\n"
    exit 1
fi

Si vous utilisez d'autres hôtes pour vos référentiels privés, vous devez les remplacer en github.comfonction de vos besoins.

Maintenant, chaque fois que vous faites un git initou, git clonegit copiera ce script dans le référentiel et l'exécutera avant que toute validation ne soit effectuée. Si vous n'avez pas défini de nom d'utilisateur local, il affichera un avertissement et ne vous laissera pas vous engager.


0

J'aime beaucoup la manière de Micah Henning dans son article (voir Configurer les identités Git ) sur ce sujet. Le fait qu'il applique et force l'identité à chaque référentiel créé / cloné est un bon moyen de ne pas oublier de le configurer à chaque fois.

Configuration de base de git

Annuler la configuration actuelle de l'utilisateur dans git:

$ git config --global --unset user.name
$ git config --global --unset user.email
$ git config --global --unset user.signingkey

Forcer la configuration de l'identité sur chaque nouveau référentiel local:

$ git config --global user.useConfigOnly true

Créez un alias Git pour la identitycommande, nous utiliserons plus tard:

$ git config --global alias.identity '! git config user.name "$(git config user.$1.name)"; git config user.email "$(git config user.$1.email)"; git config user.signingkey "$(git config user.$1.signingkey)"; :'

Création d'identités

Créez une identité avec GPG (utilisez gpgou en gpg2fonction de ce que vous avez sur votre système). Répétez les étapes suivantes pour chaque identité que vous souhaitez utiliser.

Remarque: [keyid]voici l' identifiant de la clé secrète créée. Exemple ici:

sec   rsa4096/8A5C011E4CE081A5 2020-06-09 [SC] [expires: 2021-06-09]
      CCC470AE787C057557F421488C4C951E4CE081A5
uid                 [ultimate] Your Name <youremail@domain>
ssb   rsa4096/1EA965889861C1C0 2020-06-09 [E] [expires: 2021-06-09]

La 8A5C011E4CE081A5partie après sec rsa4096/est l' identifiant de la clé.

$ gpg --full-gen-key
$ gpg --list-secret-keys --keyid-format LONG <youremail@domain>
$ gpg --armor --export [keyid]

Copiez le bloc de clé publique et ajoutez-le à vos paramètres GitHub / GitProviderOfChoice en tant que clé GPG.

Ajoutez une identité à la configuration Git. Répétez également cette opération pour chaque identité que vous souhaitez ajouter:

Note: J'utilise ici gitlabpour nommer mon identité, mais de votre question , il peut être quelque chose, ex: gitoliteou github, work, etc.

$ git config --global user.gitlab.name "Your Name"
$ git config --global user.gitlab.email "youremail@domain"
$ git config --global user.gitlab.signingkey [keyid]

Configurer l'identité d'un référentiel

Si un nouveau dépôt n'a aucune identité associée, une erreur apparaîtra lors de la validation, vous rappelant de la définir.

*** Please tell me who you are.

## parts of message skipped ##

fatal: no email was given and auto-detection is disabled

Spécifiez l'identité que vous souhaitez sur un nouveau référentiel:

$ git identity gitlab

Vous êtes maintenant prêt à vous engager avec l' identité gitlab .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.