¿Cómo rastrear directorios pero no sus archivos con Git?

85

Recientemente comencé a usar Git y tengo problemas con solo una cosa. ¿Cómo puedo rastrear directorios sin rastrear su contenido?

Por ejemplo, el sitio en el que estoy trabajando permite cargas. Quiero rastrear el directorio de cargas para que se cree al ramificar, etc. pero obviamente no los archivos dentro de él (archivos de prueba mientras está en la rama de desarrollo o los archivos reales en el maestro).

En mi .gitignore tengo lo siguiente:

cargas /*.*

También he probado (que ignora todo el directorio):

cargas /

Este directorio también puede contener subdirectorios (uploads / thumbs / uploads / videos /) Me gustaría poder rastrear estos pero no sus archivos.

¿Es esto posible con Git? He buscado por todas partes sin encontrar una respuesta.

Ben
fuente
Git solo rastrea archivos. Lo que podría hacer es jugar con git hooks y rastrear un archivo que contendrá la lista de directorios (generado automáticamente usando los hooks). Aunque no estoy del todo seguro de si eso sería posible.
Šimon Tóth
Más concreto: Git rastrea el contenido y (para git) un directorio vacío no es contenido. Puede discutir, esté de acuerdo o no, pero como otra "solución alternativa" puede pensar en crear los directorios en build / install / cuando sea necesario. Sin embargo: yo también uso la .placeholdersolución " -file";)
KingCrunch
1
En lugar de usar .placeholder, uso un archivo .gitignore. Esto no solo se encarga de las exclusiones dentro del directorio, sino que actúa como un marcador de posición en sí mismo.
Abizern

Respuestas:

113

Git no rastrea directorios, rastrea archivos, por lo que para lograr esto necesitas rastrear al menos un archivo. Entonces, asumiendo que su .gitignorearchivo se parece a esto:

upload/*

Puedes hacerlo:

$ touch upload/.placeholder
$ git add -f upload/.placeholder

Si olvidas el -f, verás:

$ git agregar upload / .placeholder
Uno de sus archivos .gitignore ignora las siguientes rutas:
subir
Utilice -f si realmente desea agregarlos.
fatal: no se agregaron archivos

Entonces, cuando lo hagas git status, verás:

# En el maestro de la sucursal
#
# Compromiso inicial
#
# Cambios a comprometer:
# (use "git rm --cached ..." para quitar el escenario)
#
# nuevo archivo: upload / .placeholder
#

Obviamente, puede hacer lo siguiente:

$ touch upload/images/.placeholder
$ git add -f upload/images/.placeholder
Peter Farmer
fuente
Gracias, esto es justo lo que necesito.
Ben
11
Una convención común para un marcador de posición es un archivo gitignore.
Cascabel
2
@Jefromi De hecho, como mis comentarios a Abizern, nunca había considerado usar el .gitignorearchivo como marcador de posición.
Peter Farmer
1
Vaya, de alguna manera me perdí esos comentarios.
Cascabel
2
Git no rastrea directorios, rastrea archivos suena raro cuando te enseñan que todo es un archivo en UNIX, incluso un directorio es un archivo
Verde
38

Escribí sobre esto aquí .

Agregue un .gitignore dentro del directorio.

Abizern
fuente
1
¡Bonito artículo y comentarios! Nunca había considerado usar .gitignore como archivo de marcador de posición ....
Peter Farmer
Gracias. Aprendí algo simplemente escribiendo una publicación y recibiendo comentarios.
Abizern
1
Parece que ahora hay una convención de nomenclatura popular para usar.gitkeep
tarabyte
Acabo de recibir ese momento "ja, ja" en este momento, me gustaría poder votar en 6 ocasiones diferentes
adelowo
6

Para rastrear solo los directorios pero no los archivos, hice lo siguiente. Gracias al comentario de @ PeterFarmer sobre los archivos de seguimiento de git, he podido mantener todos los directorios excluyendo los archivos como se describe a continuación.

# exclude everything in every folder
/data/**/*.*

# include only .gitkeep files
!/data/**/*.gitkeep

Agregar esto al archivo .gitignore hará el trabajo. La siguiente es la estructura de mi carpeta.

data/
├── processed
│   ├── dataset1.csv
│   └── dataset2.csv
├── raw
│   ├── raw_dataset1.json
└── test
    ├── subfolder
    │   └── dataset2.csv
    └── reviews.csv

Cuando lo hago git add . && git status, git solo reconoce carpetas, pero no archivos.

Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   .gitignore
        new file:   data/processed/.gitkeep
        new file:   data/raw/.gitkeep
        new file:   data/test/.gitkeep
        new file:   data/test/subfolder/.gitkeep

Tenga en cuenta lo siguiente para sus archivos .gitignore:

Anteponer una barra inclinada busca solo el directorio raíz.

/ dir

El doble asterisco busca cero o más directorios.

/ ** /

metinsenturk
fuente
¡Gracias! Lo estoy usando de esta manera y es muy útil
sebasira