¿Cuáles son las diferencias entre .gitignore y .gitkeep?

1927

¿Cuáles son las diferencias entre .gitignorey .gitkeep? ¿Son lo mismo con un nombre diferente, o ambos cumplen una función diferente?

Parece que no puedo encontrar mucha documentación sobre .gitkeep.

Matty
fuente

Respuestas:

3442

.gitkeep no está documentado, porque no es una característica de Git.

Git no puede agregar un directorio completamente vacío . Las personas que desean rastrear directorios vacíos en Git han creado la convención de poner archivos llamados.gitkeep en estos directorios. El archivo podría llamarse de cualquier forma; Git no asigna ningún significado especial a este nombre.

Existe una convención competitiva de agregar un .gitignorearchivo a los directorios vacíos para rastrearlos, pero algunas personas ven esto como confuso ya que el objetivo es mantener los directorios vacíos, no ignorarlos; .gitignoretambién se usa para enumerar archivos que Git debe ignorar al buscar archivos sin seguimiento.

Wooble
fuente
414
¿No sería una mejor solución colocar un READMEarchivo en el subdirectorio vacío que contiene un poco de información sobre para qué se va a utilizar ese subdirectorio? Parece confuso tener un archivo llamado .gitkeepque en realidad no es parte de git.
tamouse
423
@tamouse muchas veces, la ruta del directorio vacío (por ejemplo, los nombres de las carpetas) es suficiente para expresar su propósito (ejemplos: plantillas / caché, carga / pulgares, etc.). En estos casos, poner un archivo Léame en cada uno de estos se siente redundante.
Halil Özgür
16
las personas que desean realizar un seguimiento de los directorios vacíos deben indicar en un archivo README que el directorio debe crearse o crear los directorios utilizando su herramienta de compilación o cualquier herramienta que requiera que exista el directorio; /
32
@tamouse, @omouse: un .gitignorearchivo con dos líneas: *y !.gitignorees más que suficiente claridad para transmitir lo que está sucediendo. Si se necesita más elaboración, agregue un comentario en la parte superior del archivo utilizando la # sintaxis.
Droogans
63
Vale la pena notar que el popular marco Rails ha cambiado ligeramente esta convención usando .keeparchivos en lugar de .gitkeeppreservar estas carpetas vacías, ya que git no es el único sistema de control de fuente que no rastrea carpetas vacías. Más detalles aquí: github.com/rails/rails/issues/2800
Claudio
330

.gitkeepes solo un marcador de posición. Un archivo ficticio, por lo que Git no se olvidará del directorio, ya que Git solo rastrea archivos.


Si desea un directorio vacío y asegúrese de que permanezca "limpio" para Git, cree uno que .gitignorecontenga las siguientes líneas:

# .gitignore sample
###################

# Ignore all files in this dir...
*

# ... except for this one.
!.gitignore

Si desea tener un solo tipo de archivos visibles para Git, aquí hay un ejemplo de cómo filtrar todo, excepto .gitignore y todos los .txtarchivos:

# .gitignore to keep just .txt files
###################################

# Filter everything...
*

# ... except the .gitignore...
!.gitignore

# ... and all text files.
!*.txt

('#' indica comentarios).

sjas
fuente
3
Me gusta esta práctica yo mismo. Si hubiera código fuente en estos directorios, no habría necesidad de .gitkeep y, en general, es el contenido temporal / caché / usuario el que durante la prueba se generaría de todos modos, lo que provocaría que también tuviera que .gitignore esos archivos
chrisan
1
¿Por qué necesitas !delante .gitignore? ¿Es eso para escapar del punto?
Will
77
@Will - No, !niega la siguiente parte, como suele ocurrir en la programación.
sjas
3
No es necesario poner !.gitignoreun archivo de ignorar git, ya sea agregar el archivo y luego editarlo, o forzarlo a agregarlo con el contenido apropiado ("*" para ignorar todo, o nada para asegurarse de que la carpeta exista) más ejemplos .
AD7six
13
Desde su enlace: Since the git ignore file is already in the repo it is not necessary to not-ignore it - it is already tracked.------ Si no es así, y no hace un agregado contundente, puede olvidarlo. En casos triviales, no hay problema, pero si es un archivo más grande puede estar molesto. El uso !.gitignoreevita que te dispares en el pie. Lo prefiero, habiéndome quemado en el pasado.
sjas
125
.gitignore

es un archivo de texto que comprende una lista de archivos en su directorio que git ignorará o no agregará / actualizará en el repositorio.

.gitkeep

Dado que Git elimina o no agrega directorios vacíos a un repositorio, .gitkeep es una especie de truco (no creo que se llame oficialmente como parte de Git) para mantener directorios vacíos en el repositorio.

Simplemente haga una touch /path/to/emptydirectory/.gitkeeppara agregar el archivo, y Git ahora podrá mantener este directorio en el repositorio.

Jim Munro
fuente
18
Puede tener tantos .gitignores como desee, si no desea especificar la ruta completa a cada carpeta cada vez.
sjas
1
Intento mencionar la lista de directorios vacíos en el .gitkeeparchivo, pero no rastreará directorios vacíos, solo la carpeta rastreará donde .gitkeepexista el archivo. porque ?
Pardeep Jain
2
.gitkeep no funciona como .gitignore. No es una lista de directorios para guardar. Es simplemente un archivo vacío que vive en el directorio que desea mantener. Se le puede poner el nombre que desee .keep, etc. Así que puede tener un directorio como / foo / bar y el archivo gitkeep será /foo/bar/.gitkeep
Jim Munro
@sjas, ¿cómo te ahorraría tener múltiples correos electrónicos al .gitignoreespecificar la ruta completa a cada carpeta cada vez? Creo que me falta algo obvio.
Willwsharp