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.email
habitual. 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 .htaccess
configuració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, ~/work
puede 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 git
comando 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=hub
con esto y llamé hub
a mi función; si no usas hub
, reemplaza todas hub
las 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.