Guía9 min

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.

GitHub
Capas de git config: system, global y local; el agente escribe solo local

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

  1. $(prefix)/etc/gitconfig — scope system (--system)
  2. $XDG_CONFIG_HOME/git/config y ~/.gitconfigglobal (--global)
  3. $GIT_DIR/configlocal (--local, default al escribir)
  4. $GIT_DIR/config.worktreeworktree, solo si extensions.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.

Tres scopes: system y global son del humano; el agente escribe local

Lo que el agente sí / no corre

QuieroComandoTrampa
¿Quién firma?get --show-origin --show-scope user.nameset --global user.name
¿De qué archivo sale X?--show-origin --show-scopelist entero al prompt
Fijar email de este reposet --local user.email … (si falta y el humano lo pidió)--global “para no olvidarlo”
¿SSL?get --type=bool http.sslVerifyhttp.sslVerify false / GIT_SSL_NO_VERIFY

Prohibido en autónomo:

  • --global, --system, --edit / edit. El man: --global escribe ~/.gitconfig (o XDG si ese archivo ya existe). --system escribe $(prefix)/etc/gitconfig. edit abre el editor. Nada de eso es el repo del agente.
  • http.sslVerify false y GIT_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.directory desde --local. Solo protected config. * abre cualquier uid.
  • core.sshCommand opaco. El man: fetch/push usan ese comando en vez de ssh; GIT_SSH_COMMAND lo pisa. No es un “fix de auth”.
  • credential.helper que 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.*.path a un archivo que el agente creó. El include se inserta en el punto de la directiva. includeIf "gitdir:…" y onbranch: 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”.

http.sslVerify y hooksPath no se apagan para desatascar un fetch

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. Cero list al LLM.
  • Escritura: --local o 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.sshCommand y credential.helper con !.
  • 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).