¿Es posible tener una configuración de Git diferente para diferentes proyectos?

315

.gitconfiggeneralmente se almacena en el user.homedirectorio

Utilizo una identidad diferente para trabajar en proyectos para la Compañía A y algo más para la Compañía B (principalmente el nombre / correo electrónico). ¿Cómo puedo tener dos configuraciones diferentes de Git para que mis registros no vayan con el nombre / correo electrónico?

priya
fuente

Respuestas:

264

El .git/configarchivo en un clon particular de un repositorio es local para ese clon. Cualquier configuración colocada allí solo afectará las acciones para ese proyecto en particular.

(Por defecto, git configmodifica .git/config, no ~/.gitconfigsolo --globalmodifica con este último).

Ámbar
fuente
por lo tanto, modificar el archivo de configuración en la configuración para el repositorio en sí, por ejemplo, cambiar el [user] email = ...bloque, anulará el global ~/.gitconfig, ¿y esto es solo para su usuario?
dcsan
285

Hay 3 niveles de configuración de git; proyecto, global y sistema.

  • proyecto : las configuraciones del proyecto solo están disponibles para el proyecto actual y se almacenan en .git / config en el directorio del proyecto.
  • global : las configuraciones globales están disponibles para todos los proyectos para el usuario actual y se almacenan en ~ / .gitconfig.
  • sistema : las configuraciones del sistema están disponibles para todos los usuarios / proyectos y se almacenan en / etc / gitconfig.

Cree una configuración específica del proyecto, debe ejecutar esto en el directorio del proyecto:

$ git config user.name "John Doe" 

Crea una configuración global:

$ git config --global user.name "John Doe"

Crear una configuración del sistema:

$ git config --system user.name "John Doe" 

Y como puede suponer, el proyecto anula el sistema de anulaciones global y global.

teymourlouie
fuente
69
¿Existe la posibilidad de hacer alguna configuración de "directorio"? Hago un trabajo en casa y tengo carpetas con proyectos de trabajo y los míos. Entonces obtuve las carpetas ~ / job y ~ / my con git repos y quiero diferentes configuraciones para proyectos debajo de ellas. Por ejemplo, job / project1 tiene config de job / .gitconfig.
Serge
2
@Serge, ¿alguna vez descubriste si era posible crear una configuración de nivel de directorio? Tengo el mismo problema en este momento.
Cuestionando el
2
No, configuro la configuración general del sistema en datos personales y hago un script bash para configurar los datos del trabajo en ciertas configuraciones del proyecto en un comando.
Serge
1
Como anexo: solo git config user.nameo git config user.emaille mostrará el nombre o correo electrónico que Git usará para el repositorio actual.
Abhishek Divekar
1
Terminé haciendo esto para zsh : gist.github.com/pgarciacamou/3b67320e2940c8d7fa3d7bbd73873106 , espero que esto ayude a alguien.
pgarciacamou
219

A partir de la versión 2.13 de git, git admite la configuración condicional que incluye . En este ejemplo, clonamos los repositorios de la Compañía A en el ~/company_adirectorio y los repositorios de la Compañía B en ~/company_b.

En tu .gitconfigpuedes poner algo como esto.

[includeIf "gitdir:~/company_a/"]
  path = .gitconfig-company_a
[includeIf "gitdir:~/company_b/"]
  path = .gitconfig-company_b

Contenido de ejemplo de .gitconfig-company_a

[user]
name = John Smith
email = [email protected]

Contenido de ejemplo de .gitconfig-company_b

[user]
name = John Smith
email = [email protected]
crea1
fuente
1
Es genial ver que esto se ha agregado en la versión 2.13. He estado usando github.com/bddenhartog/git-profiles por un tiempo, pero no pude hacerlo funcionar con Tower.
adrum
44
includeSi es un poco quisquilloso, consulte: stackoverflow.com/questions/43919191/…
rublo
La página de documentación se ha vinculado a no menciona esto ... de hecho, la búsqueda de includeif no dió ningún resultado en la documentación
Thomas Levesque
1
@ThomasLevesque Eso es raro. Estoy seguro de que dijo algo al respecto antes. Puede encontrarlo en el registro de cambios github.com/git/git/blob/master/Documentation/RelNotes/… y también en kernel.org/pub/software/scm/git/docs/git-config.html
crea1
2
@JosephLust necesita instalar git> = 2.13 (Ubuntu 16.04 tiene git 2.7) . Obtenga la última versión de git a través de Git PPA y funcionará :)
Cas
24

Gracias @ crea1

Una pequeña variante:

Como está escrito en https://git-scm.com/docs/git-config#_includes :

Si el patrón termina con /, **se agregará automáticamente. Por ejemplo, el patrón se foo/convierte foo/**. En otras palabras, coincide fooy todo dentro, recursivamente.

Entonces uso en mi caso,
~ / .gitconfig :

[user] # as default, personal needs
    email = [email protected]
    name = bcag2
[includeIf "gitdir:~/workspace/"] # job needs, like workspace/* so all included projects
    path = .gitconfig-job

# all others section: core, alias, log…

Entonces, si el directorio del proyecto está en mi ~/wokspace/, la configuración de usuario predeterminada se reemplaza con
~ / .gitconfig-w :

[user]
name = John Smith
email = [email protected]
bcag2
fuente
Hecho esto, ahora el nombre de usuario y el correo electrónico correctos se configuran en diferentes directorios. Cuando hago git config user.name / git config user.email obtengo los detalles correctos. Pero cuando comento en un repositorio personal, siempre recoge el correo electrónico de nombre de usuario oficial global
Bhupendra
@Bhupendra En mi muestra, .gitconfig y .gitconfig-job están en mi casa, no en los directorios de proyectos. ¿Necesitas más de dos? ¿Ha creado un .gitconfig-alternativ en su directorio de inicio, como mi .gitconfig-job en mi muestra, con 3 líneas?
bcag2
@ bcag2 Yo también seguí el mismo ejemplo dado anteriormente. Tengo 2 configuraciones que funcionan por defecto y personal similar a gitconfig-job. Cuando estoy en el directorio personal, en git config user.name me da el nombre correcto, pero para empujar el commit, toma el predeterminado, mientras que necesito el personal.
swapnil2993
@ swapnil2993 primero, creo que en el tema de la ruta, pero si git config user.namedevuelve uno correcto, debería estar bien. ¿Estás bajo GNU / Linux u otro sistema operativo?
bcag2
@ bcag2 Se resolvió el problema. Acabo de corregir el camino. Pero git config user.name que devuelve el valor correcto fue extraño. Gracias por la respuesta.
swapnil2993
14

Para ser explícita, también se puede utilizar --localpara utilizar el archivo de configuración del repositorio actual :

git config --local user.name "John Doe" 
mim
fuente
12

También puede apuntar la variable de entorno GIT_CONFIGa un archivo que git configdebería usar. Con GIT_CONFIG=~/.gitconfig-A git config key valueel archivo especificado se manipula.

Stefan Näwe
fuente
2
Frio; con un poco de magia de concha inteligente, esto se puede usar para configurar las cosas, por lo que git elige el primer .gitconfig que encuentra al atravesar el árbol de directorios por encima del repositorio actual. ¡Gracias!
ecmanaut
1
¿Tienes un enlace a esta magia de concha que hace esto? Suena útil!
pchiusano
1
@pchiusano aquí hay una versión rudimentaria en fish github.com/CtrlC-Root/dotfiles/blob/master/.config/fish/…
ctrlc-root
Gracias por una solución simple que solo requiere cambiar una variable de entorno.
Noah Sussman
solo afecta el comando git config ahora github.com/git/git/blob/master/Documentation/RelNotes/…
foray1010
12

Estoy haciendo esto para mi correo electrónico de la siguiente manera:

git config --global alias.hobbyprofile 'config user.email "[email protected]"'

Luego, cuando clono un nuevo proyecto de trabajo, solo tengo que ejecutarlo git hobbyprofiley se configurará para usar ese correo electrónico.

ivand58
fuente
3

Otra forma es usar direnv y separar los archivos de configuración por directorio. Por ejemplo:

.
├── companyA
│  ├── .envrc
│  └── .gitconfig
├── companyB
│  ├── .envrc
│  └── .gitconfig
└── personal
   ├── .envrc
   └── .gitconfig

Cada uno .envrcdebe contener algo como esto:

export GIT_CONFIG=$(pwd)/.gitconfig

Y .gitconfiges habitual gitconfig con los valores deseados.

Lashevich alemanas
fuente
2

Puede personalizar la configuración de Git de un proyecto cambiando el archivo de configuración específico del repositorio (es decir /path/to/repo/.git/config). Por cierto, git configescribe en este archivo de forma predeterminada:

cd /path/to/repo
git config user.name 'John Doe'  # sets user.name locally for the repo

Prefiero crear perfiles separados para diferentes proyectos (por ejemplo, en ~/.gitconfig.d/) y luego incluirlos en el archivo de configuración del repositorio:

cd /path/to/repo
git config include.path '~/.gitconfig.d/myproject.conf'

Esto funciona bien si necesita usar el mismo conjunto de opciones en múltiples repositorios que pertenecen a un solo proyecto. También puede configurar alias de shell o un comando Git personalizado para manipular los perfiles.

Eugene Yarmash
fuente
0

Estoy en el mismo barco. Escribí un pequeño script bash para administrarlos. https://github.com/thejeffreystone/setgit

#!/bin/bash

# setgit
#
# Script to manage multiple global gitconfigs
# 
# To save your current .gitconfig to .gitconfig-this just run:
# setgit -s this
#
# To load .gitconfig-this to .gitconfig it run:
# setgit -f this
# 
# 
# 
# Author: Jeffrey Stone <[email protected]>

usage(){
  echo "$(basename $0) [-h] [-f name]" 
  echo ""
  echo "where:"
  echo " -h  Show Help Text"
  echo " -f  Load the .gitconfig file based on option passed"
  echo ""
  exit 1  
}

if [ $# -lt 1 ]
then
  usage
  exit
fi

while getopts ':hf:' option; do
  case "$option" in
      h) usage
         exit
         ;;
      f) echo "Loading .gitconfig from .gitconfig-$OPTARG"
         cat ~/.gitconfig-$OPTARG > ~/.gitconfig
         ;;
      *) printf "illegal option: '%s'\n" "$OPTARG" >&2
         echo "$usage" >&2
         exit 1
         ;;
    esac
done
netizen24601
fuente
Su script aquí está en Bash, mientras que en Github tiene la versión de Python. Tampoco -sse maneja en su script Bash.
Vadim Kotov
0

Tuve un error al intentar git stashmis cambios locales. El error de git decía "Por favor, dime quién eres" y luego me dijo "Ejecutar git config --global user.email "[email protected]y git config --global user.name "Your name"configurar la identidad predeterminada de tu cuenta". Sin embargo, debe Omitir --global para establecer la identidad solo en su repositorio actual.

Erich Meissner
fuente