¿Git elimina carpetas vacías?

¿Git elimina carpetas vacías?

Eliminé todos los archivos de un directorio en mi carpeta de trabajo, pero el directorio aún existe. Después de enviar los cambios a un repositorio remoto (GitHub) Revisé mi proyecto y noté que el directorio había desaparecido. ¿Es posible que Git borre carpetas vacías?

Respuesta1

¿Por qué no se muestra el directorio?

Git no rastrea directorios; solo rastrea archivos.

Si no hay archivos en un directorio, ese directorio no "existe" para Git al agregar o eliminar archivos. En particular, un directorio desaparecerá del índice de Git cuando haya eliminado todos los archivos y agregue ese cambio al índice. Viceversa, no se agregará un directorio git addsi está vacío.

En otras palabras: si puede ver el directorio localmente en su explorador de archivos, pero desapareció de GitHub, lo más probable es que haya eliminado todos los archivos del directorio, haya agregado ese cambio al índice y lo haya confirmado y enviado.

Entonces, ¿cómo puedo rastrear un directorio vacío?

Si desea rastrear explícitamente un directorio vacío, debe crear un archivo en él. Dado que Git no rastreará directorios vacíos, debes engañarlo para que lo haga agregando un archivo en el directorio al índice de Git.

Por lo general, las personas almacenan un archivo llamado .gitkeepen un directorio del que desean rastrear, pero donde el directorio debería permanecer vacío por el momento. Puedes dar el archivocualquierOtro nombre, por supuesto, pero el nombre .gitkeepes una convención. El .gitkeeparchivo (debido a que comienza con .) no se mostrará en las listas de archivos en la mayoría de los sistemas.

En lugar de .gitkeep, a algunos usuarios también les gusta colocar un READMEarchivo allí, idealmente con una breve descripción de por qué el directorio tiene que existir en primer lugar.

Ejemplo

$ mkdir foo
$ git init
$ git add .
$ git ls-files   # which files does Git know about?
                 # apparently, none
$ touch foo/bar  # create a file in the directory
$ git add .
$ git ls-files   # does Git know about it now?
foo/bar          # yep!

Aquí, el foodirectorio solo se agrega al índice una vez que hay un archivo en él.

Qué pasa si yoen realidad¿Quieres rastrear un directorio vacío?

Dicho todo esto, en principio, la estructura de datos subyacente permite a Git almacenar un directorio vacío, ya que estaría representado por un “árbol” vacío. Algunas lecturas adicionalesaquíyaquí.

Respuesta2

Agregue el siguiente .gitignorearchivo a las carpetas que desea incluir en su repositorio.

# Ignore everything in this directory
*
# Except this file
!.gitignore

Agregar .gitkeepfunciona pero no es una solución oficial. Verhttps://stackoverflow.com/questions/7229885/cuáles-son-las-diferencias-entre-gitignore-y-gitkeep

Respuesta3

Git podría eliminar carpetas si las ejecutara git clean( -dffxposiblemente incluso con un subconjunto de esas opciones).

Como @TRiG menciona en los comentarios, si el directorio está vacío cuando realiza la confirmación, no aparecerá, por ejemplo, en GitHub, porque git no rastrea directorios (sigue archivos): el árbol donde estaban esos archivos no está ya no es relevante porque no hay archivos, por lo que no hay árbol.

Sin más detalles, es prácticamente imposible para nosotros responder adecuadamente a sus preguntas subyacentes (¿qué pasó?).

Respuesta4

Para Linux/MAC OSX, use la siguiente frase para crear/colocar archivos de marcador de posición vacíos en las carpetas, de forma recursiva, para evitar que git los ignore:

find . -type d -empty -not -path "./.git/*" -exec touch {}/.gitkeep \;

Espero que esto ayude a alguien.

información relacionada