Guía9 min

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.

GitHub
Un coding agent lee una variable lógica de Git; el config y el working tree no se tocan

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 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:

VariableQué esNotas del man
GIT_AUTHOR_IDENTautor de un pedazo de códigolínea Nombre <email> unix -tz
GIT_COMMITTER_IDENTquién metió el código en Gitmismo formato
GIT_EDITOReditor para comandos Gitse interpreta por el shell
GIT_SEQUENCE_EDITOReditor del todo de rebase -icae a GIT_EDITOR si no hay valor propio
GIT_PAGERvisor (less, etc.)también se interpreta por el shell
GIT_DEFAULT_BRANCHprimera rama de un repo nuevolo que usaría init
GIT_SHELL_PATHbinario POSIX shellpara comandos que invocan shell
GIT_ATTR_SYSTEM / GIT_ATTR_GLOBALrutas de gitattributesse imprimen aunque el archivo no exista
GIT_CONFIG_SYSTEM / GIT_CONFIG_GLOBALrutas de configpueden 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ó”.

Flujo de git var: una clave, stdout, exit 0 o 1

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):

  1. 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.
  2. Variable conocida sin valor → stdout vacío + exit 1. En esta máquina: GIT_EDITOR y GIT_SEQUENCE_EDITOR. El man menciona default de compilación (suele ser vi); no lo asumas. Si exit 1, no hay valor. No inventes vi.
  3. 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_EDITOR y git var sin 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_EDITORcore.editor$VISUAL$EDITOR → default de compile. Orden de GIT_PAGER: $GIT_PAGERcore.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.

Límites: una clave, cero -l, cero eval del editor

Checklist

  1. ¿Necesitas una lógica (IDENT, rama inicial, ruta de config)? git var <VARIABLE> exacta, mayúsculas.
  2. Exit 0 → usa stdout. Varias líneas = varios paths, prioridad de arriba a abajo.
  3. Exit 1 → no hay valor. No inventes vi ni un email.
  4. Exit 129 → nombre mal, args de más o de menos. No reintentes con -l.
  5. Cero -l autónomo. Cero git var sin args. Cero dos variables en un argv.
  6. Cero eval del editor/pager. Cero dump de IDENT a logs.
  7. Para leer o escribir user.name, TLS, hooks: config, solo --local al escribir.
  8. Para crear commit: commit o, si el humano pide plumbing, commit-tree. var no commitea.
  9. Path impreso ≠ archivo existe. No borres ni crees esa ruta porque var la listó.
  10. 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).