¿Se puede configurar git en múltiples repositorios?

18

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 que necesito usar un valor diferente user.emailal habitual. Estos repositorios a menudo se crean y manipulan a través de scripts automáticos, y la configuración por repositorio de configuraciones locales es engorrosa.

Todos los repositorios en cuestión están ubicados bajo un prefijo de ruta 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 bajo esa ruta? (Una .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?

Caleb
fuente
Mi primer reflejo es hackear los scripts para modificar .gitconfigen cada directorio que crean. Por ejemplo, el repositorio de Android IIRC puede hacer esto, pero debes leer la fuente cuidadosamente para averiguarlo. (No estoy completamente seguro, no he hecho eso desde hace tiempo.)
Gilles 'SO siendo parada del mal'
@Gilles: Esa es ciertamente una posibilidad. Los repositorios en cuestión son el repositorio de paquetes para una distribución de Linux que recientemente migró de CVS a Git. Todavía estamos trabajando en rehacer todas nuestras herramientas. A largo plazo, es probable que esto se solucione, pero a corto plazo aquellos de nosotros que estamos trabajando en ello estamos experimentando con cuáles son las opciones.
Caleb

Respuestas:

11

No he encontrado ninguna manera de configurar git en este cuarto nivel. La única forma parece ser que el valor de configuración por comando anula el uso git -c key=value.

Mi solución hacky actual es definir una función de shell que sirva como envoltorio para git. Cuando se le llama, pasa los argumentos al comando git del sistema, pero no antes de 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 user.email=alternate@credentials.org "$@"
            ;;
        *)
            command git "$@"
            ;;
    esac
}
Caleb
fuente
Qué puedo hacer command git -c [email protected] user.name="Alter Ego" "$@"o cómo debo hacerlo ? Busqué alto y bajo y la única referencia a esta bandera -c que encontré fue la suya, gracias, muy apreciada.
Vic Goldfeld
para que conste, lo conseguí trabajando concommand git -c [email protected] -c user.name="Alter Ego" "$@"
Vic Goldfeld
6

Puede configurar la dirección de correo electrónico para git con la variable de entorno GIT_AUTHOR_EMAIL. Si combina esto con Ejecutar secuencias de comandos bash al ingresar un directorio o configuración de shell específica de directorio con zsh , puede cambiar fácilmente la configuración por directorio o directorio principal, por ejemplo, si ingresa en un directorio ~/work, puede ajustar automáticamente las variables de entorno para cambiar su correo electrónico habla a.

Ulrich Dangel
fuente
2

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

http://gik.firetrot.com/index.php/2018/05/06/git-configuration-across-multiple-repositories/

Añadir 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 = user1@email.com  
gik
fuente
¡El predicado "includeIf" me ahorra el dolor de cabeza!
Truong Nguyen
1

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 usen la nueva configuración. Yo uso hub, que es otro git wrapper, así que reemplacé mi alias git=hubcon esto y llamé huba mi función; si no lo usa hub, reemplace todas las hubinvocaciones 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 sea de origen explícito, solo en un shell interactivo), esto también afecta a otros front-end de git que leen correctamente la configuración de git, como emacs magit.

Robin Green
fuente