git var para coding agents: una variable lógica, no el config
Resumen
git var imprime una variable lógica de Git: IDENT, editor, pager, rama inicial, rutas de config. Una clave por llamada. Exit 1 si no hay valor; 129 si el nombre no existe. Cero -l autónomo: lista el config. Distinto de git config. Git 2.50.1.

Qué resuelve
Esta pieza se queda en la decisión práctica: qué instalar, qué riesgo agrega y cómo aplicarlo sin romper operación.
git var imprime una variable lógica. El man (git-var(1); git-scm.com/docs/git-var HTTP 200, last-modified 2026-08-31; pie del man local Git 2.50.1.428.g0e8243, 2025-07-22; binario Git 2.50.1 / Apple Git-155): Show a Git logical variable. DESCRIPTION: Prints a Git logical variable. Exits with code 1 if the variable has no value. SYNOPSIS: git var (-l | <variable>).
Contrato para un coding agent: una clave conocida, stdout, exit code. No escribe. No mueve HEAD. No toca el index. No es un dump de .git/config. El valor de GIT_AUTHOR_IDENT es una línea computada (Nombre <email> unix-tz); no es una clave que git config get vaya a devolver con ese nombre.
No es config: config lee o escribe sección.clave. git var -l sí mezcla lógicas + config, y el man marca esa parte deprecated a favor de git config -l. No es commit: commit crea un objeto y mueve HEAD. No es commit-tree: commit-tree consume author/committer; var solo los muestra. Vive en el hub comparativas y decisiones.
Qué hace (y qué no)
Una llamada, una variable. El man lista estas lógicas:
| Variable | Qué es | Notas del man |
|---|---|---|
GIT_AUTHOR_IDENT | autor de un pedazo de código | línea Nombre <email> unix -tz |
GIT_COMMITTER_IDENT | quién metió el código en Git | mismo formato |
GIT_EDITOR | editor para comandos Git | se interpreta por el shell |
GIT_SEQUENCE_EDITOR | editor del todo de rebase -i | cae a GIT_EDITOR si no hay valor propio |
GIT_PAGER | visor (less, etc.) | también se interpreta por el shell |
GIT_DEFAULT_BRANCH | primera rama de un repo nuevo | lo que usaría init |
GIT_SHELL_PATH | binario POSIX shell | para comandos que invocan shell |
GIT_ATTR_SYSTEM / GIT_ATTR_GLOBAL | rutas de gitattributes | se imprimen aunque el archivo no exista |
GIT_CONFIG_SYSTEM / GIT_CONFIG_GLOBAL | rutas de config | pueden ser varias, separadas por newline |
El man: Most path values contain only one value. However, some can contain multiple values, which are separated by newlines, and are listed in order from highest to lowest priority. Verificado 2026-09-06: git var GIT_CONFIG_GLOBAL devolvió dos líneas ($XDG_CONFIG_HOME/git/config y ~/.gitconfig). Un parser que asume “una línea = un valor” se come la segunda.
También: Note that paths are printed even if they do not exist, but not if they are disabled by other environment variables. Existencia en disco ≠ valor. No hagas test -f para decidir si git var “falló”.

Exit codes: 0, 1 y 129
El contrato útil no está en el texto del valor; está en el código de salida.
Verificado 2026-09-06 (Git 2.50.1 / Apple Git-155):
- Variable conocida con valor → stdout + exit 0.
GIT_AUTHOR_IDENT,GIT_COMMITTER_IDENT,GIT_PAGER,GIT_DEFAULT_BRANCH,GIT_SHELL_PATH, rutas de attr/config. - Variable conocida sin valor → stdout vacío + exit 1. En esta máquina:
GIT_EDITORyGIT_SEQUENCE_EDITOR. El man menciona default de compilación (suele servi); no lo asumas. Si exit 1, no hay valor. No inventesvi. - Nombre desconocido, minúsculas, dos args o sin args →
usage: git var (-l | <variable>)+ exit 129.git var GIT_FOO,git var git_author_ident,git var GIT_AUTHOR_IDENT GIT_EDITORygit varsin argumentos cayeron aquí.
El man solo documenta el 1. El 129 es usage de Git, el mismo patrón que otros porcelains. Un agente que trata 129 como “vacío” y reintenta con -l está a un paso de volcar el config entero al contexto.
-l no es para el loop
-l: Display the logical variables. In addition, all the variables of the Git configuration file .git/config are listed as well. (However, the configuration variables listing functionality is deprecated in favor of git config -l.)
Verificado: git var -l mezcla user.name, credential.helper, remote.origin.url y las GIT_*. Eso no es una variable lógica. Es un dump. Un coding agent no corre -l autónomo. Si el humano pide “lista el config”, el verbo es config list/get --show-origin, no var.
Tampoco pipes -l al LLM. Hay helpers de credenciales, URLs y safe.directory. El IDENT ya trae email: úsalo para construir un commit, no para reimprimirlo en logs de sesión.
IDENT no se setea con var
GIT_AUTHOR_IDENT y GIT_COMMITTER_IDENT son salida. El ejemplo del man:
$ git var GIT_AUTHOR_IDENT
Eric W. Biederman <[email protected]> 1121223278 -0600
Formato: nombre, email entre <>, epoch, offset. El epoch cambia cada segundo; no lo uses como id estable. Para fijar autor/committer el camino es env (GIT_AUTHOR_NAME, GIT_AUTHOR_EMAIL, GIT_AUTHOR_DATE, equivalentes COMMITTER) o user.name/user.email local. var no tiene subcomando set.
SEE ALSO del man: git-commit-tree(1), git-tag(1), git-config(1). commit-tree lee identidad para el objeto; var te dice cuál usaría Git ahora. Si vas a commit-tree, lee IDENT una vez en ese tick y no lo reimprimas.
GIT_DEFAULT_BRANCH es el nombre que init usaría para la primera rama (main aquí). No crea la rama. No cambia init.defaultBranch. Solo informa.
Editores y pager: valor para el shell, no para el prompt
GIT_EDITOR, GIT_SEQUENCE_EDITOR y GIT_PAGER are meant to be interpreted by the shell when it is used. El man da ejemplos con espacios y flags (gvim.exe --nofork). Orden de GIT_EDITOR: $GIT_EDITOR → core.editor → $VISUAL → $EDITOR → default de compile. Orden de GIT_PAGER: $GIT_PAGER → core.pager → $PAGER → default (suele ser less).
Un agente no lanza ese string. No hace eval. No abre vim. Si GIT_EDITOR sale 1, el siguiente paso no es “editar el rebase todo”: es no entrar a un rebase interactivo. GIT_SEQUENCE_EDITOR sin valor no significa “usa nano”; el man dice que cae a git var GIT_EDITOR, y ese también puede ser 1.
GIT_PAGER=cat en un entorno de agente es frecuente (CI, harness). No lo “corrijas” a less. No pages dumps al modelo.

Checklist
- ¿Necesitas una lógica (
IDENT, rama inicial, ruta de config)?git var <VARIABLE>exacta, mayúsculas. - Exit 0 → usa stdout. Varias líneas = varios paths, prioridad de arriba a abajo.
- Exit 1 → no hay valor. No inventes
vini un email. - Exit 129 → nombre mal, args de más o de menos. No reintentes con
-l. - Cero
-lautónomo. Cerogit varsin args. Cero dos variables en un argv. - Cero
evaldel editor/pager. Cero dump de IDENT a logs. - Para leer o escribir
user.name, TLS, hooks: config, solo--localal escribir. - Para crear commit: commit o, si el humano pide plumbing, commit-tree. var no commitea.
- Path impreso ≠ archivo existe. No borres ni crees esa ruta porque var la listó.
- Si el humano no pidió identidad ni editor, no llames var. YAGNI.
FAQ
¿Puedo listar todas las lógicas sin el config? No hay flag. -l mezcla y está deprecado para la parte de config. Pide las claves que necesitas, una por una.
¿git var user.name? No. Eso es usage 129. user.name es config.
¿Por qué GIT_EDITOR da 1 si el man habla de vi? Porque “no value” gana. Verificado: stdout vacío, exit 1. El default de compile no apareció en esta corrida. Trata el 1 como vacío.
¿El IDENT es el usuario de GitHub? No. Es la identidad de Git, igual que user.name/user.email. GitHub Docs lo deja explícito en la guía de username: no es el handle. No lo uses como login.
¿Puedo parsear solo el email y meterlo en el system prompt? No. El email es PII. Léelo para firmar un objeto si el humano lo pidió; no lo caches en memoria del agente.
Fuentes
Man local git-var(1) Git 2.50.1.428.g0e8243 (2025-07-22) y binario Git 2.50.1 / Apple Git-155, verificados 2026-09-06. git-scm.com/docs/git-var HTTP 200, last-modified 2026-08-31. Contrastado con git-config, git-commit-tree y git-init (HTTP 200 el mismo día). Comandos corridos: git var GIT_AUTHOR_IDENT, GIT_COMMITTER_IDENT, GIT_EDITOR (exit 1), GIT_SEQUENCE_EDITOR (exit 1), GIT_PAGER, GIT_DEFAULT_BRANCH, GIT_SHELL_PATH, rutas attr/config, git var sin args / GIT_FOO / minúsculas / dos args (129), git var -l (mezcla config; no uses el dump).
Lecturas relacionadas
Sigue explorando Coding Agents y otras piezas para builders.

git multi-pack-index para coding agents: un índice de packs, no gc

git check-mailmap para coding agents: canónico, no reescritura

git commit-graph para coding agents: índice de historia, no gc
