git config para coding agents: get, --local, cero --global
Resumen
git config consulta y escribe opciones de Git. Un agente lee con git config get --show-origin --show-scope; escribe solo --local. Prohibido --global, --system, --edit, http.sslVerify=false, core.hooksPath=/dev/null y safe.directory=*. user.name no es el usuario de GitHub; GitHub Docs lo deja explícito. 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 config no es un editor de identidad global. El man (git-config(1), Git 2.50.1 / Apple Git-155; git-scm.com/docs/git-config HTTP 200): consulta, setea, reemplaza o borra opciones. El nombre es sección.clave. Subcomandos actuales: list, get, set, unset, rename-section, remove-section, edit. Los modos git config <name>, -l, --get, --edit están deprecados.
GitHub Docs (HTTP 200, 2026-09-04, Setting your username in Git): user.name asocia commits a una identidad. No es el username de GitHub. El cambio solo afecta commits futuros. Un coding agent no pisa ~/.gitconfig del humano. Contrato: leer con origen y scope; escribir solo --local; no apagar TLS, hooks ni safe.directory.
Dónde vive cada valor
FILES del man, de primero a último (el último gana):
$(prefix)/etc/gitconfig— scope system (--system)$XDG_CONFIG_HOME/git/configy~/.gitconfig— global (--global)$GIT_DIR/config— local (--local, default al escribir)$GIT_DIR/config.worktree— worktree, solo siextensions.worktreeConfig
git -c y GIT_CONFIG_KEY_<n> son scope command. Protected configuration = system + global + command. safe.directory solo se respeta ahí: un repo ajeno no puede ampliarse a sí mismo.
--worktree sin extensions.worktreeConfig es igual a --local. En un worktree extra, $GIT_DIR es worktrees/<id>/; el config local del main es $GIT_COMMON_DIR/config y se comparte. Un set --local en un worktree sin la extensión pisa el repo entero.
git config get --show-origin --show-scope user.name
git config get --show-origin --show-scope user.email
git config get --show-origin --show-scope http.sslVerify
get emite el último valor. --all emite todos. Sin la clave: exit 1. -z / --null: valor termina en NUL; el key y el value se separan con LF. Parser de scripts: eso, no git config -l al LLM.

Lo que el agente sí / no corre
| Quiero | Comando | Trampa |
|---|---|---|
| ¿Quién firma? | get --show-origin --show-scope user.name | set --global user.name |
| ¿De qué archivo sale X? | --show-origin --show-scope | list entero al prompt |
| Fijar email de este repo | set --local user.email … (si falta y el humano lo pidió) | --global “para no olvidarlo” |
| ¿SSL? | get --type=bool http.sslVerify | http.sslVerify false / GIT_SSL_NO_VERIFY |
Prohibido en autónomo:
--global,--system,--edit/edit. El man:--globalescribe~/.gitconfig(o XDG si ese archivo ya existe).--systemescribe$(prefix)/etc/gitconfig.editabre el editor. Nada de eso es el repo del agente.http.sslVerify falseyGIT_SSL_NO_VERIFY. Default true. Apagar verificación TLS no es un workaround de certificado.core.hooksPath=/dev/null. El man: desactiva todos los hooks. Un hook rojo se arregla; no se silencia. Relativo: path respecto al directorio donde corren los hooks (githooks(5)).safe.directory=*o--add safe.directorydesde--local. Solo protected config.*abre cualquier uid.core.sshCommandopaco. El man:fetch/pushusan ese comando en vez dessh;GIT_SSH_COMMANDlo pisa. No es un “fix de auth”.credential.helperque empieza con!(shell). El man: puede ser helper, path absoluto o comandos de shell. Un agente no inyecta shell ahí. Secretos: secretos, no config.include.path/includeIf.*.patha un archivo que el agente creó. El include se inserta en el punto de la directiva.includeIf "gitdir:…"yonbranch:cambian identidad según cwd; no es un “perfil del agente”.- Volcar
git config list(pager.config aplica). Demasiado para el prompt; pedí claves.
Modos deprecados (git config user.email, --get, -l): el man pide subcomandos. Un agente usa get / set / list.
Receta (60 segundos)
Solo en un worktree propio:
git config get --show-origin --show-scope user.name
git config get --show-origin --show-scope user.email
Si falta identidad y bloquea el commit: no adivines. GitHub Docs: el nombre de Git ≠ login de GitHub; el email de commit es otra guía. user.useConfigOnly=true (global, del humano) evita que Git invente user.email. Un agente no lo setea; lo respeta.
Si el humano pidió un override de este repo:
git config set --local user.email "[email protected]"
git config get --show-origin --show-scope user.email
Cierre del trabajo: PR, no un set --global “para la próxima”.

includeIf, -c y el entorno
includeIf "gitdir:<glob>", onbranch:<rama>, hasconfig:remote.*.url:<url> meten otro archivo si la condición es true. Path relativo = relativo al archivo que incluye, no al cwd. Un agente lee --show-origin; no añade includes.
git -c core.hooksPath=/dev/null commit es scope command: protected, y apaga hooks en ese proceso. Misma trampa que el set permanente.
GIT_CONFIG_COUNT + GIT_CONFIG_KEY_<n> / VALUE_<n>: runtime, pisan archivos, los pisa -c. Útil en un harness que no quiere tocar disco. Un agente no usa GIT_CONFIG (histórico; solo afecta al binario git config, como --file).
safe.directory interpola ~/. Vacío resetea la lista. dir/* abre todos los repos debajo. Un clone de otro uid que pide safe.directory es un olor: no lo “arregles” con *.
Checklist
- Lectura:
get --show-origin --show-scope. Cerolistal LLM. - Escritura:
--localo nada. Cero--global/--system/edit. -
user.name≠ username de GitHub. No inventar identidad. - Cero
http.sslVerify=false,core.hooksPath=/dev/null,safe.directory=*. - Cero
core.sshCommandycredential.helpercon!. - Cierre = PR, no un config global.
FAQ
¿git config user.email sigue funcionando? Sí, deprecado. El man: git config get user.email / git config set user.email <valor>.
¿--local en un worktree cambia solo esa sesión? Sin extensions.worktreeConfig, no: es $GIT_DIR/config del repo común.
¿Por qué no --global user.name “como dice GitHub”? GitHub Docs muestra --global para tu máquina. El agente no es el dueño de ~/.gitconfig.
¿http.sslVerify false para un proxy corporativo? El man: default true; override GIT_SSL_NO_VERIFY. Un agente no apaga TLS. El humano mete CA (http.sslCAInfo) en protected config.
El curso instalar un agente cubre el loop local. Hub: comparativas y decisiones. Config no es sandbox (sandboxing): un include local no sustituye permisos del runtime.
Verificado 2026-09-04 contra git-config(1) (Git 2.50.1 / Apple Git-155), git-scm.com/docs/git-config (HTTP 200) y GitHub Docs “Setting your username in Git” (HTTP 200, /get-started/git-basics/setting-your-username-in-git).
Lecturas relacionadas
Sigue explorando Coding Agents y otras piezas para builders.



