- Git controla su forma de funcionar mediante archivos específicos dentro del repositorio, que no son configuración interna de
.git/, sino archivos que se confirman y viajan junto con el código
.gitignore, .gitattributes, .lfsconfig, .gitmodules, .mailmap, etc. se encargan respectivamente de excluir archivos del seguimiento, definir atributos, configurar LFS, administrar submódulos y unificar autores
.git-blame-ignore-revs y .gitmessage permiten ignorar commits de formateo de código y usar plantillas de mensajes de commit, mejorando la calidad de la colaboración
- GitHub, GitLab, Gitea, etc. amplían funciones como CI/CD o asignación de revisores mediante carpetas de configuración específicas de cada forja como
.github/, .gitlab/ y .gitea/
- Esta estructura se aplica también más allá de Git, en herramientas como EditorConfig, Docker y gestores de versiones de lenguajes, formando un ecosistema de configuración automática basado en dotfiles
Principales archivos mágicos de Git
- Git reconoce varios archivos especiales como
.gitignore, .gitattributes, .lfsconfig, .gitmodules y .mailmap para controlar el comportamiento del repositorio
- Estos archivos no son configuración interna de
.git/, sino componentes compartidos que se confirman en el repositorio, lo que garantiza un comportamiento consistente al colaborar
.gitignore
- Define patrones de archivos que Git no debe rastrear
- Soporta comodines (
*.log), directorios (dist/) y negaciones (!important.log)
- Se aplica en el orden
.gitignore, .git/info/exclude, configuración global (~/.config/git/ignore)
- Los archivos ya rastreados seguirán siéndolo incluso después de agregar
.gitignore, y pueden eliminarse con git rm --cached
- GitHub, GitLab y Gitea permiten confirmar archivos que coinciden con patrones ignorados sin mostrar advertencias
- GitHub ofrece plantillas de
.gitignore por lenguaje en su repositorio oficial
.gitattributes
- Controla por archivo filtros, diff, merge, finales de línea y detección de lenguaje
- Ej.:
*.psd filter=lfs, *.png binary, *.sh text eol=lf
text normaliza finales de línea, binary desactiva diff/merge y merge=ours conserva la versión local en caso de conflicto
- GitHub Linguist lee
.gitattributes para excluir estadísticas de lenguaje, plegar código generado y excluir documentación, entre otros usos
- También reconoce
.gitattributes por directorio y .git/info/attributes
.lfsconfig
- Guarda la configuración de Git LFS junto con el repositorio
.gitattributes define qué archivos se manejan con LFS, y .lfsconfig se encarga de los detalles como la ubicación del servidor
- Para mover archivos ya existentes en commits anteriores a LFS, se necesita el comando
git lfs migrate
.gitmodules
- Guarda la información de configuración de submódulos
- Se crea con
git submodule add y se consulta con git submodule update
- Al hacer
git clone, los submódulos no se descargan automáticamente; se necesita la opción --recurse-submodules
- Tiene desventajas como no poder rastrear rangos de versiones y generar directorios
.git anidados
.mailmap
- Permite unificar nombres y correos electrónicos de autores
- Se muestra con el nombre unificado en
git log, git shortlog, git blame, etc.
- El gráfico de contribuidores de GitHub no refleja mailmap
- La ubicación puede definirse con
.mailmap o con la configuración mailmap.file
.git-blame-ignore-revs
- Define una lista de commits que
git blame debe ignorar
- Se activa con
git config blame.ignoreRevsFile .git-blame-ignore-revs
- GitHub, GitLab (15.4+) y Gitea lo reconocen automáticamente
- Si el archivo no existe, puede producirse un error, por lo que se recomienda mantener un archivo vacío
.gitmessage
- Define una plantilla de mensaje de commit
- Ej.:
# <type>: <subject>
#
# Types: feat, fix, docs, style, refactor, test, chore
- Requiere configurarse con
git config commit.template .gitmessage
- Después de clonar, hace falta una configuración manual; algunos equipos lo automatizan con herramientas como husky
- Como alternativa, se pueden usar hooks
commit-msg o prepare-commit-msg
Carpetas de extensión específicas de cada forja
- GitHub, GitLab, Gitea, Forgejo y Bitbucket usan sus propias carpetas de configuración
.github/, .gitlab/, .gitea/, .forgejo/, .bitbucket/
- Incluyen flujos de trabajo de CI/CD, plantillas de issues y PR, archivos CODEOWNERS, etc.
- Forgejo usa fallback en el orden
.forgejo/ → .gitea/ → .github/, y Gitea en el orden .gitea/ → .github/
- SourceHut usa
.build.yml o .builds/*.yml
Otros archivos convencionales
- .gitkeep: como Git no rastrea directorios vacíos, se usa como archivo dummy para conservarlos
- .gitconfig: ofrece ejemplos de configuración de Git por proyecto, pero no se carga automáticamente
- .gitsigners: administra la lista de claves de firma GPG/SSH y puede especificarse con
gpg.ssh.allowedSignersFile
- .gitreview: archivo de configuración del servidor de revisión de código Gerrit
- .gitlint: define reglas de lint para mensajes de commit
- .jj/: directorio de estado de Jujutsu, un VCS compatible con Git, que puede coexistir con
.git/
El ecosistema de dotfiles más allá de Git
- .editorconfig: mantiene un estilo de código consistente entre editores
- Define indentación, finales de línea, codificación, eliminación de espacios en blanco, etc.
- Es compatible con editores principales como VS Code, Vim y Emacs
- .ruby-version, .node-version, .python-version: herramientas de gestión de versiones de lenguajes como rbenv, nodenv y pyenv las leen para cambiar automáticamente de versión
- .tool-versions: archivo de gestión multilenguaje de asdf
- .dockerignore: especifica archivos a excluir durante el build de Docker
- Usa la misma sintaxis de patrones que
.gitignore, mejora la velocidad de build y excluye información sensible
Aspectos a considerar al desarrollar herramientas integradas con Git
- Las herramientas que manejan repositorios Git deben reconocer obligatoriamente los siguientes archivos
.gitignore: aplicar patrones ignorados al explorar archivos
.gitattributes: distinguir archivos binarios y generados
.mailmap: mostrar información de autores de forma unificada
.gitmodules: manejar submódulos
- El formato de los archivos de configuración de Git sigue la estructura
[section "subsection"] key = value, y puede leerse o escribirse con el comando git config
- La mayoría de las bibliotecas Git para distintos lenguajes ofrecen funciones para analizar este formato
2 comentarios
No conocía
gitmessage, pero creo que voy a probarlo.Comentarios de Hacker News
.gitignorey por eso no muestran archivos ignorados en la UI web, pero esa explicación parece incorrectaEn realidad no se muestran porque los archivos ignorados no están incluidos en el repositorio. Si un archivo ya fue committeado, más bien debería mostrarse
.gitignore, igual sigue viéndose en la UI. Eso es porque el archivo sigue siendo parte del repoEn cambio, también es posible hacer commit a un archivo ignorado desde el principio, pero requiere un pequeño truco
.gitignoresolo decide si ocultar archivos untracked o no. Si quieres, también puedes hacer commit de archivos ignoradosshowinwebui=(true|false)😄.git/info/exclude. Es como un gitignore solo local, una configuración solo para míPor ejemplo, sirve cuando estás investigando un bug y quieres dejar archivos temporales aunque cambies de rama
Yo uso un alias de shell como este Así puedo agregar algo fácilmente con
git-ignore-local myfile.extEn macOS solo hay que ajustar la parte de
readlinkSi registras esta función en el PATH comogit-ignore-local, puedes usarla comogit ignore-local.git/info/excludetambién se menciona al inicio de la explicación de.gitignore/test export-ignoreen.gitattributes, puedes excluir archivos de prueba al desplegar en un servidor de producciónCuando una herramienta de despliegue como Capistrano usa
git export, esto se aplica automáticamente, así que los archivos de prueba no suben al servidorNo afecta el desarrollo y además ahorra espacio en disco
git archiveCasi no lo he visto usarse ni en herramientas básicas de CI. Capistrano fue el primer caso donde vi que se aprovechaba
Como referencia, con la opción
export-substtambién puedes insertar dentro de un archivo información parecida agit describejj, quería excluir por completo la carpeta.jjdel repo y de todas las operaciones de GitIncluso que no se borrara con
git clean -xdf. Por ahora lo resuelvo con un alias temporal:git clean -e .jj.git/info/exclude.mailmapLa discusión relacionada está en GitHub Community Discussion
package-lock.json merge=oursPorque en merge o rebase el significado de ours/theirs no es claro
Ese tipo de configuración solo tiene sentido en herramientas de fusión automatizada, como git-annex branch
Referencia: explicación del significado de ours/theirs, estructura interna de git-annex
.git-blame-ignore-revses una buena función, pero debería ir en la sección de “otras convenciones”Si no lo configuras en el cliente de git, en un repositorio donde ese archivo no exista git blame falla
(:optional)para que no dé error aunque falte el archivoLa explicación está en esta respuesta de Stack Overflow
Eso sí, es una lástima que no todas las herramientas soporten
.mailmap. Por ejemplo, IntelliJ todavía lo tiene como bug/solicitud de funciónAdemás,
.git-blame-ignore-revses solo una convención; hay que configurarlo manualmente para que funcione.ignorePensaba que solo aplicaba
.gitignore, pero al cambiar la configuración de ripgrep en.ignorelos resultados de búsqueda cambiaron. Resultó ser un comportamiento razonableEnlace: artículo de nesbitt.io