¿Cómo agrego un directorio vacío a un repositorio Git?
¿Cómo agrego un directorio vacío (que no contiene archivos) a un repositorio Git?
Otra forma de hacer que un directorio permanezca (casi) vacío (en el repositorio) es crear un .gitignore
archivo dentro de ese directorio que contenga estas cuatro líneas:
# Ignore everything in this directory
*
# Except this file
!.gitignore
Entonces no es necesario que realice el pedido correctamente como debe hacerlo en la solución de m104 .
Esto también brinda el beneficio de que los archivos en ese directorio no aparecerán como "sin seguimiento" cuando realice un estado de git.
Hacer persistente el comentario de @GreenAsJade :
Creo que vale la pena señalar que esta solución hace precisamente lo que pedía la pregunta, pero quizás no sea lo que muchas personas que hayan analizado esta pregunta habrán estado buscando. Esta solución garantiza que el directorio permanezca vacío. Dice "Realmente nunca quiero que los archivos se registren aquí". A diferencia de "Todavía no tengo ningún archivo para registrar aquí, pero necesito el directorio aquí, es posible que los archivos lleguen más tarde".
No puedes. Consulte las preguntas frecuentes sobre Git .
Actualmente, el diseño del índice git (área de preparación) solo permite enumerar archivos, y nadie lo suficientemente competente para realizar el cambio para permitir directorios vacíos se ha preocupado lo suficiente por esta situación como para remediarla.
Los directorios se agregan automáticamente al agregar archivos dentro de ellos. Es decir, nunca es necesario agregar directorios al repositorio y no se les realiza un seguimiento por sí solos.
Puede decir "
git add <dir>
" y agregará archivos allí.Si realmente necesita que exista un directorio en las cajas, debe crear un archivo en él. .gitignore funciona bien para este propósito; puede dejarlo vacío o completar los nombres de los archivos que espera que aparezcan en el directorio.
Cree un archivo vacío llamado .gitkeep
en el directorio y git add
.
Este será un archivo oculto en sistemas tipo Unix de forma predeterminada, pero obligará a Git a reconocer la existencia del directorio, ya que ahora tiene contenido.
También tenga en cuenta que no hay nada especial en el nombre de este archivo. Podrías haberle puesto el nombre que quisieras. Lo único que le importa a Git es que la carpeta tenga algo dentro.
Siempre puede colocar un archivo README en el directorio con una explicación de por qué desea este directorio, que de otro modo estaría vacío, en el repositorio.
touch .placeholder
En Linux, esto crea un archivo vacío llamado .placeholder
. Por si sirve de algo, este nombre es independiente de git, y este enfoque se utiliza en varios otros lugares del sistema, por ejemplo /etc/cron.d/.placeholder
. En segundo lugar, como señaló otro usuario, la .git
convención de prefijo se puede reservar para archivos y directorios que el propio Git utiliza con fines de configuración.
Alternativamente, como se indica en otra respuesta , el directorio puede contener un archivo README.md
descriptivo .
De cualquier manera, esto requiere que la presencia del archivo no provoque que su aplicación se rompa.
¿Por qué necesitaríamos carpetas versionadas vacías?
Lo primero es lo primero:
Un directorio vacío no puede formar parte de un árbol en el sistema de versiones de Git .
Simplemente no será rastreado. Pero hay escenarios en los que "controlar versiones" de directorios vacíos puede ser significativo, por ejemplo:
- crear una estructura de carpetas predefinida , poniéndola a disposición de todos los usuarios/colaboradores del repositorio; o, como caso especializado de lo anterior, crear una carpeta para archivos temporales , como directorios
cache/
ologs/
, donde queremos proporcionar la carpeta pero.gitignore
su contenido. - En relación con lo anterior, algunos proyectos no funcionarán sin algunas carpetas (lo que a menudo es un indicio de un proyecto mal diseñado, pero es un escenario frecuente en el mundo real y tal vez podría haber, por ejemplo, problemas de permisos que abordar).
Algunas soluciones sugeridas
Muchos usuarios sugieren:
- Colocar un
README
archivo u otro archivo con algún contenido para que el directorio no esté vacío, o - Crear un
.gitignore
archivo con una especie de "lógica inversa" (es decir, incluir todos los archivos) que, al final, cumple el mismo propósito que el enfoque n.° 1.
Si bien ambas soluciones seguramente funcionan, las encuentro inconsistentes con un enfoque significativo para el control de versiones de Git.
- ¿Por qué se supone que debes colocar archivos falsos o README que tal vez no quieras en tu proyecto?
- ¿Por qué
.gitignore
hacer algo ( mantener archivos) que es todo lo contrario de lo que está destinado ( excluir archivos), aunque sea posible?
enfoque .gitkeep
Utilice un archivo vacío llamado .gitkeep
para forzar la presencia de la carpeta en el sistema de versiones.
Aunque pueda parecer que no es una diferencia tan grande:
Utiliza un archivo que tiene el único propósito de conservar la carpeta. No pones allí ninguna información que no quieras poner.
Por ejemplo, debería utilizar archivos README como archivos README con información útil, no como excusa para conservar la carpeta.
La separación de preocupaciones siempre es algo bueno y aún puede agregar una
.gitignore
para ignorar archivos no deseados.Nombrarlo
.gitkeep
deja muy claro y directo desde el nombre del archivo en sí (y también para otros desarrolladores , lo cual es bueno para un proyecto compartido y uno de los propósitos principales de un repositorio Git) que este archivo es- Un archivo no relacionado con el código (debido al punto inicial y al nombre)
- Un archivo claramente relacionado con Git
- Su propósito ( mantener ) está claramente establecido y es consistente y semánticamente opuesto en su significado de ignorar.
Adopción
He visto el .gitkeep
enfoque adoptado por marcos muy importantes como Laravel , Angular-CLI .