¿Cómo decirle a git que use la identidad correcta (nombre y correo electrónico) para un proyecto determinado?

117

Uso mi computadora portátil personal tanto para el trabajo como para proyectos personales y me gustaría usar mi dirección de correo electrónico del trabajo para mis confirmaciones en el trabajo (gitolite) y mi dirección de correo electrónico personal para el resto (github).

Leí sobre las siguientes soluciones, que son todas globales o temporales:

Una solución es ejecutar manualmente una función de shell que establezca mi entorno en trabajo o personal , pero estoy bastante seguro de que a menudo me olvido de cambiar a la identidad correcta, lo que resulta en comprometerme con la identidad incorrecta.

¿Existe alguna forma de vincular un determinado repositorio, nombre de proyecto, etc. a una identidad (nombre, correo electrónico)? ¿Que hace la gente?

Martin Jambon
fuente
1
Le pido que acepte una de las respuestas. Espero que alguno de ellos te haya ayudado a resolver tu problema.
RBT

Respuestas:

134

git config user.email "[email protected]"

Hacer eso dentro de un repositorio establecerá la configuración en ESE repositorio, y no globalmente.

Parece que eso es más o menos lo que buscas, a menos que te esté malinterpretando.

Dan Ray
fuente
Supongo que debería hacerlo. Espero tener varios repositorios locales para el mismo proyecto, especialmente para cambiar entre ramas más fácilmente sin tener que volver a compilar todo. Tal vez sea solo un mal hábito de svn. Gracias.
Martin Jambon
1
@ Martin: no he estado usando git por mucho tiempo, pero la sensación que tengo es que usar múltiples repositorios locales sería un flujo de trabajo inusual para git. Aun así, solo necesitaría ejecutar esto una vez en una instancia del repositorio, y está configurado para la vida útil de ese repositorio, por lo que no es tan malo.
Dan Ray
@DanRay De hecho, es una configuración común si, como en el caso de Martin, el repositorio local tiene archivos locales no confirmados. Cambiar de una rama a otra no reconstruiría automáticamente los archivos. Si evitar "recompilar todo" es un objetivo, usar varios repositorios locales es la forma correcta de hacerlo.
dolmen
1
git config --global user.email "[email protected]" Agregar el --global hace que funcione en todos los repositorios. fuente: help.github.com/articles/setting-your-username-in-git
SashiOno
1
Esta es una tarea manual y puede olvidarse. Las soluciones automáticas son sugeridas por @ dragon788 y yo
naitsirch
47

Debe usar el comando de configuración local a continuación:

conjunto local

git config user.email [email protected]
git config user.name 'Mahmoud Zalt'

obtener local

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

El archivo de configuración local se encuentra en el directorio del proyecto: .git/config.

conjunto global

git config --global user.email [email protected]
git config --global user.name 'Mahmoud Zalt'

obtener global

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

El archivo de configuración global en en su directorio: ~/.gitconfig.

Recuerde citar espacios en blanco, etc., por ejemplo: 'Nombre Apellido'

Mahmoud Zalt
fuente
23

Edite el archivo de configuración en la carpeta ".git" para mantener el nombre de usuario y el correo electrónico diferentes según el repositorio

  • Ve a tu repositorio
  • Muestra los archivos ocultos y ve a la carpeta ".git"
  • Encuentra el archivo "config"
  • Agregue las siguientes líneas en EOF

[usuario]

nombre = Bob

email = [email protected]

El siguiente comando le muestra qué nombre de usuario y correo electrónico configurado para este repositorio.

git config --get user.name

git config --get user.email

Ejemplo: para el mío ese archivo de configuración en D: \ workspace \ eclipse \ ipchat \ .git \ config

Aquí ipchat es mi nombre de repositorio

arulraj.net
fuente
16

Si lo usa git config user.email "[email protected]", estará vinculado al proyecto actual en el que se encuentra.

Eso es lo que hago por mis proyectos. Establezco la identidad apropiada cuando clono / inicio el repositorio. No es infalible (si te olvidas y presionas antes de darte cuenta, estás manchado) pero es tan bueno como puedes obtener sin la capacidad de decirgit config --global user.email 'ILLEGAL_VALUE'

De hecho, puedes hacer un valor ilegal. Establecer sugit config --global user.name $(perl -e 'print "x"x968;')

Luego, si olvida establecer sus valores no globales, recibirá un mensaje de error.

[EDITAR] En un sistema diferente tuve que aumentar el número de x a 968 para que fallara con "fatal: identificador personal imposiblemente largo". Misma versión de git. Extraño.

Seth Robertson
fuente
Suena como un gran truco, pero no funcionó para mí. Tanto el commit como el push a gitolite remote fueron exitosos.
Martin Jambon
@Martin Jambon: Extraño. Estoy usando la versión 1.7.4.5 de git
Seth Robertson
@Martin Jambon: También puede intentar configurar su nombre de usuario / dirección de correo electrónico global en "x". Algunas versiones anteriores de git rechazaron valores demasiado pequeños. Informe qué versión / os de git tiene si esto no funciona.
Seth Robertson
@Martin Jambon: Pruebe 968 "x" y vea si eso funciona mejor para usted.
Seth Robertson
8

Si no usa el --globalparámetro, establecerá las variables solo para el proyecto actual.

ismail
fuente
8

A partir de Git 2.13, puede usar un includeIfen su gitconfig para incluir un archivo con una configuración diferente según la ruta del repositorio donde está ejecutando sus comandos git.

Dado que un Git lo suficientemente nuevo viene con Ubuntu 18.04, he estado usando esto en mi versión ~/.gitconfigbastante feliz.

[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

Para usar Git 2.13, deberá agregar un PPA (Ubuntu anterior a 18.04 / Debian) o descargar los binarios e instalarlos (Windows / otro Linux).

dragón788
fuente
Muy útil y exactamente lo que estaba buscando. Combinado con git config core.sshCommandmúltiples claves privadas, brinda una administración de identidad git completa y sin problemas.
topr
0

Una solución es ejecutar manualmente una función de shell que establezca mi entorno en trabajo o personal, pero estoy bastante seguro de que a menudo me olvido de cambiar a la identidad correcta, lo que resulta en comprometerme con la identidad incorrecta.

Ese era exactamente mi problema. He escrito un script de gancho que le advierte si tiene algún control remoto de github y no ha definido un nombre de usuario local.

Así es como lo configura:

  1. Cree un directorio para contener el gancho global

    mkdir -p ~/.git-templates/hooks

  2. Dile a git que copie todo en ~/.git-templatestu .gitdirectorio por proyecto cuando ejecutes git init o clone

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

  3. Y ahora copie las siguientes líneas ay ~/.git-templates/hooks/pre-commithaga que el archivo sea ejecutable (¡no olvide esto, de lo contrario, git no lo ejecutará!)

#!/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 utiliza otros hosts para sus repositorios privados, debe reemplazarlos github.comsegún sus necesidades.

Ahora, cada vez que hagas a git inito git clonegit copiará este script en el repositorio y lo ejecutará antes de que se realice cualquier confirmación. Si no ha establecido un nombre de usuario local, generará una advertencia y no le permitirá comprometerse.

naitsirch
fuente
0

Me gusta mucho la forma de Micah Henning en su artículo (ver Configuración de identidades de Git ) sobre este tema. El hecho de que aplique y fuerce la identidad a cada repositorio creado / clonado es una buena forma de no olvidar configurar esto cada vez.

Configuración básica de git

Anule la configuración del usuario actual en git:

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

Forzar la configuración de identidad en cada nuevo repositorio local:

$ git config --global user.useConfigOnly true

Cree un alias de Git para el identitycomando, lo usaremos más adelante:

$ 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)"; :'

Creación de identidades

Cree una identidad con GPG (use gpgo gpg2dependiendo de lo que tenga en su sistema). Repita los siguientes pasos para cada identidad que desee utilizar.

Nota: [keyid]aquí está el identificador de la clave secreta creada. Ejemplo aquí:

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 8A5C011E4CE081A5parte posterior sec rsa4096/es el identificador de la clave.

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

Copie el bloque de clave pública y agréguelo a su configuración de GitHub / GitProviderOfChoice como una clave GPG.

Agregue identidad a la configuración de Git. También repita esto para cada identidad que desee agregar:

Nota: aquí utilizo gitlabpara nombrar mi identidad, pero a partir de su pregunta puede ser cualquier cosa, por ejemplo , gitoliteo , etc.githubwork

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

Configurar identidad para un repositorio

Si un nuevo repositorio no tiene una identidad asociada, aparecerá un error en la confirmación, recordándole que lo configure.

*** Please tell me who you are.

## parts of message skipped ##

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

Especifique la identidad que desea en un nuevo repositorio:

$ git identity gitlab

Ahora está listo para comprometerse con la identidad de gitlab .

elbaid
fuente