git ready

aprendiendo git de a un commit por vez
por Nick Quaranto, traducido por Matías Flores

¿qué hay dentro del directorio .git?

publicado el 23 Mar 2009

ACTUALIZACION: He recibido muchos comentarios valiosos con correcciones a la descripción de varios archivos y su función. Gracias a todos.

Una de las cosas que más me gustan de Git es que mantiene toda la información que necesita en un sólo lugar: el directorio .git del directorio raíz de tu proyecto. Si aún no has estado investigando su contenido, ¡no te preocupes! Ahí hay unas cuántas cosas con las que entretenerse. Echemos un vistazo a los archivos y directorios más importantes.

La estructura básica es la siguiente:

.
|-- COMMIT_EDITMSG
|-- FETCH_HEAD
|-- HEAD
|-- ORIG_HEAD
|-- branches
|-- config
|-- description
|-- hooks
|   |-- applypatch-msg
|   |-- commit-msg
|   |-- post-commit
|   |-- post-receive
|   |-- post-update
|   |-- pre-applypatch
|   |-- pre-commit
|   |-- pre-rebase
|   |-- prepare-commit-msg
|   `-- update
|-- index
|-- info
|   `-- exclude
|-- logs
|   |-- HEAD
|   `-- refs
|-- objects
`-- refs
    |-- heads
    |-- remotes
    |-- stash
    `-- tags

Analicemos algunos de los archivos que puedes ver normalmente en el directorio .git:

  • COMMIT_EDITMSG: Contiene la descripción del último commit. En realidad este archivo no es utilizado por Git, sólo existe para fines informativos.
  • config: Contiene las opciones de configuración de este repositorio. La configuración específica a este repositorio se define en este archivo (incluso los aliases!) El uso más común de este archivo es especificar la ubicación de cada repositorio remoto y definir algunas opciones claves, como ser si tu repositorio posee o no un área de trabajo.
  • description: Si utilizas gitweb o ejecutas git instaweb, esta descripción se mostrará cuando estés viendo tu repositorio o la lista de repositorios.
  • FETCH_HEAD: Los SHAs de todas las ramas que fueron actualizadas por el último git fetch.
  • HEAD: El ref actual. En la mayoría de los casos éste es probablemente refs/heads/master.
  • index: El área de staging conteniendo información acerca de los archivos que serán incluídos en el próximo commit.
  • packed-refs: refs inactivos. Esta no es la lista definitiva de refs en tu repositorio (¡el directorio refs tiene la lista real!) Mira el comentario de gitster para mayor información sobre este tema.
  • ORIG_HEAD: Durante una integración, este es el SHA de la rama en la que se está realizando la operación.
  • MERGE_HEAD: Durante una integración, este es el SHA de la rama desde la cual se están tomando los cambios a integrar.
  • MERGE_MODE: Se utiliza para pasar opciones de un git merge al siguiente git commit cuando ocurre un conflicto durante la integración y se requiere un git commit para finalizar la operación. Actualmente --no-ff es la única opción que se pasa de esta forma.
  • MERGE_MSG: Enumera los conflictos que se produjeron en el último git merge.
  • RENAMED-REF: Aún estoy intentando analizar este archivo. Aparentemente, está relacionado con errores ocurridos al grabar refs.

También hay unos cuantos directorios:

  • hooks: Un directorio que rapidamente se convertirá en tu mejor amigo: contiene distintos scripts que son ejecutados en determinados momentos al trabajar con Git, como por ejemplo después de cada commit o antes de cada rebase. Una serie completa de artículos acerca de los hooks está en camino.
  • info: Relativamente sin importancia, a excepción del archivo exclude que se encuentra dentro de este directorio. Ya hemos analizado este archivo en el artículo ignorando archivos, pero para refrescar la memoria: puedes usar este archivo para ignorar archivos en este proyecto. Eso sí, ¡ten cuidado! Este archivo no está versionado como sí lo estaría un archivo .gitignore.
  • logs: Contiene la historia de las distintas ramas. Aparentemente se lo utiliza principalmente con el comando reflog.
  • objects: El depósito interno de objetos, indexados por SHAs.
  • rebase-apply: La base para el comando rebase y también para git am. Si te atreves, es posible ajustar el archivo patch dentro de este directorio.
  • refs: La copia maestra de todos los refs que existen en tu repositorio, ya sean stashes, tags, ramas locales o remotas.

Sólo una advertencia si vas a jugar con los aspectos internos de Git: asegúrate de saber lo que estás haciendo, y si no, ¡haz una copia de respaldo! Modificar los archivos de configuración o los scripts en hooks es bastante simple, pero yo no modificaría otra cosa de no ser absolutamente necesario. Si por alguna razón necesitas hacer esto regularmente como parte de tu método de trabajo, probablemente debes estar haciendo algo mal.

Hay mucho más acerca del funcionamiento interno de Git, cosas que aún no hemos cubierto en este artículo. Una de las mejores guías disponibles es Git Community Book, y por supuesto, también puedes descargar los fuentes por tu cuenta e investigarlos. Si tienes más información sobre el contenido del directorio .git, ¡déjanos un comentario!