2011-02-23 12 views
54

Recientemente comencé a usar Git y estoy teniendo problemas con solo una cosa. ¿Cómo puedo rastrear directorios sin rastrear sus contenidos?¿Cómo rastrear directorios pero no sus archivos con Git?

Por ejemplo, el sitio en el que estoy trabajando permite las cargas. Quiero rastrear el directorio de cargas para que se cree cuando se bifurcan, 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 el siguiente:

uploads/*.*

también han tratado (que ignora el directorio completo):

uploads/

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

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

+0

Git solo rastrea los archivos.Lo que podría hacer es jugar con git hooks y rastrear un archivo que contendrá la lista del directorio (generado automáticamente usando los enganches). Aunque no estoy del todo seguro de si eso sería posible. –

+0

Más concreto: Git rastrea _content_ y (para git) un directorio vacío no es contenido. Puede argumentar, ya sea que esté de acuerdo o no, pero como otra "solución alternativa" puede pensar en crear los directorios en build/install/when-needed. Sin embargo: uso el "' .placeholder'-file "-solution también;) – KingCrunch

+0

En lugar de usar .placeholder, utilizo un archivo .gitignore. Esto no solo se ocupa de las exclusiones dentro del directorio, sino que también actúa como un marcador de posición. – Abizern

Respuesta

72

Git no rastrea los directorios, rastrea los archivos, por lo que para lograr esto necesita rastrear al menos un archivo. Así que asumiendo su archivo .gitignore ve algo como esto:

upload/* 

usted puede hacer esto:

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

Si olvida la -f verá:

 
$ git add upload/.placeholder 
The following paths are ignored by one of your .gitignore files: 
upload 
Use -f if you really want to add them. 
fatal: no files added 

Entonces cuando lo hace git status verá:

 
# On branch master 
# 
# Initial commit 
# 
# Changes to be committed: 
# (use "git rm --cached ..." to unstage) 
# 
# new file: upload/.placeholder 
# 

Obviamente se puede hacer a continuación:

$ touch upload/images/.placeholder 
$ git add -f upload/images/.placeholder 
+0

Gracias, esto es justo lo que necesito. – Ben

+8

Una convención común para un marcador de posición es un archivo de gitignore. – Cascabel

+2

@Jefromi De hecho, como mis comentarios a Abizern, nunca había considerado usar el archivo '.gitignore' como marcador de posición. –

31

me escribió acerca de esta here.

Agregue un .gitignore dentro del directorio.

+1

¡Bonito artículo y comentarios! Nunca había considerado usar .gitignore como el archivo de marcador de posición .... –

+0

Gracias. Aprendí algo solo escribiendo una publicación y obteniendo comentarios. – Abizern

+0

Parece haber una convención de nomenclatura popular ahora para usar '.gitkeep' – tarabyte

10

Mejor respondidos a la que he encontrado es incluir un archivo .gitignore en su carpeta de carga con este contenido

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

Aquí tienes How can I add an empty directory to a Git repository?

+2

No funciona con estructuras de carpetas anidadas. – shashwat

Cuestiones relacionadas