¿Se puede establecer la configuración de git en varios repositorios?

¿Se puede establecer la configuración de git en varios repositorios?

Git parece admitir valores de configuración en tres niveles:

  • Configuración global por sistema (almacenada en /etc/git-core)
  • Configuración global por usuario (almacenada en ~/.gitconfig)
  • Configuración local por repositorio (almacenada en $REPO/.git/config)

Estas opciones cubren la mayor parte de la base, pero estoy buscando una manera de manejar un cuarto nivel. Tengo una colección (muy) grande de repositorios para los cuales necesito usar un valor diferente al user.emailhabitual. Estos repositorios a menudo se crean y manipulan mediante scripts automatizados, y la configuración local por repositorio es engorrosa.

Todos los repositorios en cuestión se encuentran bajo un prefijo de ruta determinado en mi sistema local. ¿Hay alguna manera de establecer un valor de configuración en algún lugar que sea heredado por todos los repositorios en esa ruta? (Una especie de .htaccessconfiguración similar hereda todo el sistema de archivos). ¿Quizás habría una manera de establecer valores condicionales en el archivo de configuración global? ¿Qué otros arreglos podrían hacerse en un entorno UNIX para hacer frente a un conjunto de repositorios como el mío?

Respuesta1

No encontré forma de configurar git en este cuarto nivel. La única forma parece ser anular el valor de configuración por comando usando git -c key=value.

Mi solución hacky actual es definir una función de shell que sirva como contenedor para git. Cuando se llama, pasa los argumentos al comando git del sistema, no sin antes verificar el directorio de trabajo actual y agregar un argumento adicional al comando, si corresponde.

function git () {
    case "$PWD" in
        /path/to/repos/*)
            command git -c [email protected] "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}

Respuesta2

Vea esta solución basada en la configuración de git:

https://dzone.com/articles/how-to-use-gitconfigs-includeif

Agregar al archivo “~/.gitconfig”:

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

Cree el archivo “~/.gitconfig-project1″ con contenido:

    [core]  
      sshCommand = "ssh -i ~/.ssh/project1 -F /dev/null"  
  
    [user]  
      name = user1  
      email = [email protected]  

Respuesta3

Puede configurar la dirección de correo electrónico para git con la variable de entorno GIT_AUTHOR_EMAIL. Si combinas esto conEjecutar scripts bash al ingresar a un directoriooconfiguración de shell específica del directorio con zshpuede cambiar fácilmente la configuración por directorio o directorio principal, por ejemplo, si ingresa a un directorio, ~/workpuede ajustar automáticamente las variables de entorno para cambiar su dirección de correo electrónico.

Respuesta4

Según la respuesta de Caleb, podemos definir un gitcomando modificado que configure permanentemente todos los repositorios en este directorio correctamente, de modo que todos los usos futuros de vanilla git utilicen la nueva configuración. Yo uso hub, que es otro contenedor de git, así que reemplacé mi alias git=hubcon esto y llamé huba mi función; si no usas hub, reemplaza todas hublas invocaciones con command git:

function git() {
    case "$PWD" in
        /home/robin/git/3RD_PARTY)
            hub "$@"
            # We don't know which repository was cloned / operated on, so let's just reconfigure them all
            for f in *; do
                [[ -d "$f" ]] && hub -C "$f" config user.email $my_private_email
            done
            ;;
        /home/robin/git/3RD_PARTY/*)
            hub "$@"
            hub config user.email $my_private_email
            ;;
        *)
            hub "$@"
            ;;
    esac
}

A diferencia de la respuesta de Caleb, que solo funciona en un shell (y, a menos que se obtenga explícitamente, solo en un shell interactivo), esto también afecta a otras interfaces de git que leen correctamente la configuración de git, como emacs magit.

información relacionada