-
1. Inicio - Sobre el Control de Versiones
-
2. Fundamentos de Git
-
3. Ramificaciones en Git
-
4. Git en el Servidor
- 4.1 Los Protocolos
- 4.2 Configurando Git en un servidor
- 4.3 Generando tu clave pública SSH
- 4.4 Configurando el servidor
- 4.5 El demonio Git
- 4.6 HTTP Inteligente
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Git en un alojamiento externo
- 4.10 Resumen
-
5. Git en entornos distribuidos
-
6. GitHub
-
7. Herramientas de Git
- 7.1 Revisión por selección
- 7.2 Organización interactiva
- 7.3 Guardado rápido y Limpieza
- 7.4 Firmando tu trabajo
- 7.5 Buscando
- 7.6 Reescribiendo la Historia
- 7.7 Reiniciar Desmitificado
- 7.8 Fusión Avanzada
- 7.9 Rerere
- 7.10 Haciendo debug con Git
- 7.11 Submódulos
- 7.12 Agrupaciones
- 7.13 Replace
- 7.14 Almacenamiento de credenciales
- 7.15 Resumen
-
8. Personalización de Git
-
9. Git y Otros Sistemas
- 9.1 Git como Cliente
- 9.2 Migración a Git
- 9.3 Resumen
-
10. Los entresijos internos de Git
-
A1. Apéndice A: Git en otros entornos
- A1.1 Interfaces gráficas
- A1.2 Git en Visual Studio
- A1.3 Git en Eclipse
- A1.4 Git con Bash
- A1.5 Git en Zsh
- A1.6 Git en Powershell
- A1.7 Resumen
-
A2. Apéndice B: Integrando Git en tus Aplicaciones
- A2.1 Git mediante Línea de Comandos
- A2.2 Libgit2
- A2.3 JGit
-
A3. Apéndice C: Comandos de Git
- A3.1 Configuración
- A3.2 Obtener y Crear Proyectos
- A3.3 Seguimiento Básico
- A3.4 Ramificar y Fusionar
- A3.5 Compartir y Actualizar Proyectos
- A3.6 Inspección y Comparación
- A3.7 Depuración
- A3.8 Parcheo
- A3.9 Correo Electrónico
- A3.10 Sistemas Externos
- A3.11 Administración
- A3.12 Comandos de Fontanería
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