Git
Chapters ▾ 2nd Edition

10.8 Los entresijos internos de Git - Variables de entorno

Variables de entorno

Git siempre se ejecuta dentro de un shell bash, y utiliza una serie de variables de entorno de shell para determinar cómo comportarse. En ocasiones, es muy útil saber cuáles son, y cómo pueden ser utilizadas para hacer que Git se comporte de la manera que deseas. Esta no es una lista exhaustiva de todas las variables de entorno a las que Git presta atención, pero cubriremos las más útiles.

Comportamiento Global

Como programa de computadora que es, el comportamiento general de Git depende de variables de entorno.

GIT_EXEC_PATH determina el sitio donde Git busca sus subprogramas (como git-commit, git-diff, y otros). Puedes comprobar la configuración actual ejecutando git --exec-path.

HOME por regla general no se considera personalizable (demasiadas cosas dependen de él), pero es el sitio donde Git busca el archivo de configuración global. Si deseas una instalación de Git realmente portable, completa con configuración global, puedes sobreescribir HOME en el perfil de shell portable de Git.

PREFIX es parecido, pero para la configuración del sistema. Git busca este archivo en $PREFIX/etc/gitconfig.

GIT_CONFIG_NOSYSTEM, si está establecida, deshabilita el uso del archivo de configuración del sistema. Esto es útil si la configuración de tu sistema está interfiriendo con tus comandos, pero no tienes acceso para modificarlo o eliminarlo.

GIT_PAGER controla el programa usado para mostrar la salida de varias páginas en la línea de comandos. Si no está establecida, será usado PAGER por defecto.

GIT_EDITOR es el editor que Git lanzará cuando el usuario necesite editar un texto (un mensaje para confirmación de cambio, por ejemplo). Si no está establecida, será usado EDITOR.

Ubicaciones del Repositorio

Git utiliza varias variables de entorno para determinar la forma en que interactúa con el repositorio actual.

GIT_DIR es la ubicación del directorio .git. Si no se especifica, Git subirá por el árbol de directorios hasta llegar a ~ o /, en busca de un directorio .git en cada directorio visitado.

GIT_CEILING_DIRECTORIES controla el comportamiento de búsqueda del directorio .git. Si accedes a directorios que son lentos de cargar (tales como aquellos en un dispositivo de cinta magnética, o a través de una conexión de red lenta), es posible que desees que Git se detenga antes de lo establecido, especialmente si Git se invoca durante la construcción de tu indicador de shell.

GIT_WORK_TREE es la ubicación de la raíz del directorio de trabajo para un repositorio con contenido. Si no se especifica, se utiliza el directorio padre de $GIT_DIR.

GIT_INDEX_FILE es la ruta de acceso al archivo index (solo repositorios con contenido).

GIT_OBJECT_DIRECTORY puede utilizarse para especificar la ubicación del directorio que normalmente reside en .git/objects.

GIT_ALTERNATE_OBJECT_DIRECTORIES es una lista separada por dos puntos (formateada como /dir/one:/dir/two:…) que indica a Git dónde buscar objetos si no están en GIT_OBJECT_DIRECTORY. Si tienes muchos proyectos con archivos grandes que tienen exactamente el mismo contenido, puedes utilizar esto para evitar almacenar demasiadas copias de ellos.

Especificaciones de Rutas de Acceso (pathspecs)

Un 'pathspec' se refiere a la forma de especificar rutas de acceso a las cosas en Git, incluyendo el uso de comodines. Se utilizan en el archivo .gitignore, pero también en la línea de comandos (git add *.c).

GIT_GLOB_PATHSPECS y GIT_NOGLOB_PATHSPECS controlan el comportamiento por defecto de los comodines en las especificaciones de rutas de acceso. Si GIT_GLOB_PATHSPECS está establecida a 1, los caracteres de comodín actúan como comodines (lo cual es la situación por defecto); si GIT_NOGLOB_PATHSPECS está establecida a 1, los caracteres de comodín sólo coinciden consigo mismos, lo que significa que algo como \*.c solo coincidiría con un archivo llamado *.c, en lugar de cualquier archivo cuyo nombre acabe en .c. Puedes sobreescribir esto para casos individuales iniciando la especificación de ruta de acceso con :(glob) o :(literal), como en :(glob)*.c.

GIT_LITERAL_PATHSPECS deshabilita los dos comportamientos anteriores; los caracteres de comodín no funcionarán, y la sobreescritura de prefijos estará deshabilitada también.

GIT_ICASE_PATHSPECS establece todas las especificaciones de rutas de acceso para que funcionen de forma que no se diferencie entre mayúsculas y minúsculas (case-insensitive).

Confirmaciones (Committing)

La creación final de un objeto de confirmación de cambios en Git se realiza generalmente con git-commit-tree, que utiliza estas variables de entorno como su fuente primera de información, utilizando los valores de la configuración sólo si éstas no están presentes.

GIT_AUTHOR_NAME es el nombre completo en el campo 'author'.

GIT_AUTHOR_EMAIL es el email para el campo 'author'.

GIT_AUTHOR_DATE es la fecha y hora utilizada para el campo 'author'.

GIT_COMMITTER_NAME establece el nombre completo para el campo 'committer'.

GIT_COMMITTER_EMAIL es la dirección de email para el campo 'committer'.

GIT_COMMITTER_DATE se utiliza para la fecha y hora en el campo 'committer'.

EMAIL es la dirección de email utilizada en caso de que el valor de configuración user.email no esté establecido. Si éste no está configurado, Git utilizará los nombres de usuario y equipo.

Red

Git utiliza la biblioteca curl para realizar operaciones de red sobre HTTP, así que GIT_CURL_VERBOSE le indica a Git que emita todos los mensajes generados por esta biblioteca. Esto es similar a hacer curl -v en la línea de comandos.

GIT_SSL_NO_VERIFY indica a Git que no verifique los certificados SSL. Esto a veces puede ser necesario si estás utilizando un certificado autofirmado para servir un repositorio Git a través de HTTPS, o estás montando un servidor Git, pero todavía no has instalado un certificado completo.

Si la velocidad de datos de una operación de HTTP es menor de GIT_HTTP_LOW_SPEED_LIMIT bytes por segundo durante más de GIT_HTTP_LOW_SPEED_TIME segundos, Git abortará esa operación. Estos valores sobreescriben los valores de configuración http.lowSpeedLimit y http.lowSpeedTime.

GIT_HTTP_USER_AGENT establece el texto de agente de usuario utilizado por Git cuando se comunica sobre HTTP. El valor predeterminado es similar a git/2.0.0.

Diferencias y Fusiones

GIT_DIFF_OPTS es un nombre poco apropiado. Los únicos valores válidos son -u<n> o --unified=<n>, que controla el número de líneas de contexto mostradas en un comando git diff.

GIT_EXTERNAL_DIFF se utiliza como para sobreescribir el valor de configuración diff.external. Si está establecido, Git invocará este programa cuando se ejecute git diff.

GIT_DIFF_PATH_COUNTER y GIT_DIFF_PATH_TOTAL son útiles para el programa especificado en GIT_EXTERNAL_DIFF o diff.external. El primero representa el archivo de la serie (empezando en 1) que está siendo comparado, y el último es el número total de archivos en el lote.

GIT_MERGE_VERBOSITY controla la salida de la estrategia de fusión recursiva. Los valores permitidos son los siguientes:

  • 0 no muestra nada, excepto un simple mensaje de error, posiblemente.

  • 1 muestra sólo los conflictos.

  • 2 también muestra los cambios de los archivos.

  • 3 muestra cuando los archivos son ignorados porque no han sido modificados.

  • 4 muestra todas las rutas de acceso a medida que son procesadas.

  • 5 y muestra información de depuración detallada.

El valor predeterminado es 2.

Depuración

¿Quieres saber lo que hace realmente Git? Git tiene un conjunto bastante completo de trazas incorporadas, y todo lo que hay que hacer es activarlas. Los posibles valores de estas variables son los siguientes:

  • 'true', '1', o '2' — la categoría de la traza se escribe a stderr — .

  • Una ruta absuluta iniciada con / — la salida de la traza será escrita en ese archivo — .

GIT_TRACE controla las trazas generales, que no se ajustan a una categoría específica. Esto incluye la expansión de alias, y la delegación a otros subprogramas.

$ GIT_TRACE=true git lga
20:12:49.877982 git.c:554               trace: exec: 'git-lga'
20:12:49.878369 run-command.c:341       trace: run_command: 'git-lga'
20:12:49.879529 git.c:282               trace: alias expansion: lga => 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.879885 git.c:349               trace: built-in: git 'log' '--graph' '--pretty=oneline' '--abbrev-commit' '--decorate' '--all'
20:12:49.899217 run-command.c:341       trace: run_command: 'less'
20:12:49.899675 run-command.c:192       trace: exec: 'less'

GIT_TRACE_PACK_ACCESS controla el trazado de acceso a empaquetados (packfile). El primer campo es el archivo empaquetado que está siendo accedido, el segundo es el desplazamiento (offset) dentro del archivo:

$ GIT_TRACE_PACK_ACCESS=true git status
20:10:12.081397 sha1_file.c:2088        .git/objects/pack/pack-c3fa...291e.pack 12
20:10:12.081886 sha1_file.c:2088        .git/objects/pack/pack-c3fa...291e.pack 34662
20:10:12.082115 sha1_file.c:2088        .git/objects/pack/pack-c3fa...291e.pack 35175
# […]
20:10:12.087398 sha1_file.c:2088        .git/objects/pack/pack-e80e...e3d2.pack 56914983
20:10:12.087419 sha1_file.c:2088        .git/objects/pack/pack-e80e...e3d2.pack 14303666
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

GIT_TRACE_PACKET habilita el trazado a nivel de paquete para las operaciones de red.

$ GIT_TRACE_PACKET=true git ls-remote origin
20:15:14.867043 pkt-line.c:46           packet:          git< # service=git-upload-pack
20:15:14.867071 pkt-line.c:46           packet:          git< 0000
20:15:14.867079 pkt-line.c:46           packet:          git< 97b8860c071898d9e162678ea1035a8ced2f8b1f HEAD\0multi_ack thin-pack side-band side-band-64k ofs-delta shallow no-progress include-tag multi_ack_detailed no-done symref=HEAD:refs/heads/master agent=git/2.0.4
20:15:14.867088 pkt-line.c:46           packet:          git< 0f20ae29889d61f2e93ae00fd34f1cdb53285702 refs/heads/ab/add-interactive-show-diff-func-name
20:15:14.867094 pkt-line.c:46           packet:          git< 36dc827bc9d17f80ed4f326de21247a5d1341fbc refs/heads/ah/doc-gitk-config
# […]

GIT_TRACE_PERFORMANCE controla el registro de datos de rendimiento. La salida muestra cuánto dura cada invocación particular de git.

$ GIT_TRACE_PERFORMANCE=true git gc
20:18:19.499676 trace.c:414             performance: 0.374835000 s: git command: 'git' 'pack-refs' '--all' '--prune'
20:18:19.845585 trace.c:414             performance: 0.343020000 s: git command: 'git' 'reflog' 'expire' '--all'
Counting objects: 170994, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (43413/43413), done.
Writing objects: 100% (170994/170994), done.
Total 170994 (delta 126176), reused 170524 (delta 125706)
20:18:23.567927 trace.c:414             performance: 3.715349000 s: git command: 'git' 'pack-objects' '--keep-true-parents' '--honor-pack-keep' '--non-empty' '--all' '--reflog' '--unpack-unreachable=2.weeks.ago' '--local' '--delta-base-offset' '.git/objects/pack/.tmp-49190-pack'
20:18:23.584728 trace.c:414             performance: 0.000910000 s: git command: 'git' 'prune-packed'
20:18:23.605218 trace.c:414             performance: 0.017972000 s: git command: 'git' 'update-server-info'
20:18:23.606342 trace.c:414             performance: 3.756312000 s: git command: 'git' 'repack' '-d' '-l' '-A' '--unpack-unreachable=2.weeks.ago'
Checking connectivity: 170994, done.
20:18:25.225424 trace.c:414             performance: 1.616423000 s: git command: 'git' 'prune' '--expire' '2.weeks.ago'
20:18:25.232403 trace.c:414             performance: 0.001051000 s: git command: 'git' 'rerere' 'gc'
20:18:25.233159 trace.c:414             performance: 6.112217000 s: git command: 'git' 'gc'

GIT_TRACE_SETUP muestra información que Git va descubriendo sobre el repositorio y el entorno con el que interactúa.

$ GIT_TRACE_SETUP=true git status
20:19:47.086765 trace.c:315             setup: git_dir: .git
20:19:47.087184 trace.c:316             setup: worktree: /Users/ben/src/git
20:19:47.087191 trace.c:317             setup: cwd: /Users/ben/src/git
20:19:47.087194 trace.c:318             setup: prefix: (null)
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

Varios

GIT_SSH, si se especifica, es un programa que se invoca en lugar de ssh cuando Git intenta conectar a un equipo SSH. Se invoca como $GIT_SSH [username@]host [-p <port>] <command>. Observa que esta no es la forma más fácil de personalizar como ssh es invocado; no soportará parámetros extra en la línea de comandos, de modo que tendrías que escribir un script envoltorio y hacer que GIT_SSH apunte a él. Es probablemente más fácil usar simplemente el archivo ~/.ssh/config para esto.

GIT_ASKPASS es una sobreescritura para el valor de configuración core.askpass. Este es el programa invocado cada vez que Git necesita pedir al usuario las credenciales, que puede mostrar un indicador similar a la línea de comandos, y debería devolver la respuesta en stdout. (Consulta Almacenamiento de credenciales para más detalles acerca de este subsistema.)

GIT_NAMESPACE controla el acceso a las referencias de un espacio de nombres, y es equivalente al indicador --namespace. Esto es principalmente útil en el lado servidor, donde puedes querer almacenar múltiples bifurcaciones (forks) de un único repositorio en un repositorio, solo manteniendo las referencias separadas.

GIT_FLUSH puede usarse para forzar a Git a usar Entrada/Salida sin buffer cuando escribe de forma incremental a la salida estándar (stdout) . Un valor de 1 hace que Git actualice más a menudo, un valor de 0 hace que toda la salida sea con buffer. El valor por defecto (si esta variable no está definida) es elegir un esquema de buffer adecuado en función de la actividad y el modo de salida.

GIT_REFLOG_ACTION te permite especificar el texto descriptivo escrito en el registro de referencias. Aquí tienes un ejemplo:

$ GIT_REFLOG_ACTION="my action" git commit --allow-empty -m 'my message'
[master 9e3d55a] my message
$ git reflog -1
9e3d55a HEAD@{0}: my action: my message