una - ignorar carpetas en git
¿Cuál es la diferencia entre ignorar el directorio y el directorio/* de Git? (4)
Estoy confundido sobre cuál es la forma correcta de ignorar los contenidos de un directorio en git.
Supongamos que tengo la siguiente estructura de directorio:
my_project
|--www
|--1.txt
|--2.txt
|--.gitignore
Cuál es la diferencia entre poner esto:
www
¿Y esto?
www/*
La razón por la que hago esta pregunta es: en git, si un directorio está vacío, git no incluirá ese directorio vacío en el repositorio. Así que estaba intentando la solución que es agregar un archivo .gitkeep adicional debajo del directorio para que no esté vacío. Cuando estaba probando esa solución, si estoy en el archivo .gitignore, escribo como a continuación:
www
!*.gitkeep
No funciona (Mi intención es ignorar todos los contenidos en www pero mantener el directorio). Pero si pruebo lo siguiente:
www/*
!*.gitkeep
¡Entonces funciona! Entonces creo que debe tener algunas diferencias entre los dos enfoques.
Además de las respuestas perfectamente buenas que ya has obtenido, debes tener en cuenta que puedes tener .gitignore
en cualquier parte de tu proyecto, incluidas las subcarpetas.
Entonces, si quieres ignorar todos los archivos dentro de www
, pero ¿cuál es la carpeta www
para versionar, en lugar de usar un .gitkeep
vacío, .dummy
o el nombre que elijas, por qué no usar un .gitignore
allí, diciéndole que ignore todos los archivos?
/
|- .gitignore (a)
/- www
|- .gitignore (b)
|- 1.jpg
/- 2.jpg
En la raíz .gitignore
(a), no dice nada sobre la carpeta www
o sus contenidos.
En www/.gitignore
(b) pones lo siguiente:
# ignore all files in this folder except this .gitignore
*
!.gitignore
De esta forma, todo se ve más organizado (al menos para mí).
Existen diferencias entre www
, www/
y www/*
.
Básicamente, a partir de la documentation y mis propias pruebas, www
encuentra una coincidencia con un archivo o directorio, www/
solo coincide con un directorio, mientras que www/*
coincide con directorios y archivos dentro de www
.
Solo discutiré las diferencias entre www/
y www/*
aquí, ya que las diferencias entre www
y www/
son obvias.
Para www/
, git ignora el directorio www
, lo que significa que git ni siquiera mirará dentro. Pero para www/*
, git comprueba todos los archivos / carpetas dentro de www
, e ignora todos ellos con el patrón *
. Parece conducir a los mismos resultados ya que git no rastreará una carpeta vacía www
si se ignoran todos sus archivos / carpetas secundarios. Y, de hecho, los resultados no serán ninguna diferencia para el caso de OP con www/
o www/*
independiente. Pero sí crea diferencias si se combina con otras reglas.
Por ejemplo, ¿qué www/1.txt
si solo queremos incluir www/1.txt
pero ignoramos todos los demás dentro de www
?
El siguiente .gitignore
no funcionará.
www/
!www/1.txt
Mientras que el siguiente .gitignore
funciona, ¿por qué?
www/*
!www/1.txt
Para el primero, git simplemente ignora el directorio www
, y ni siquiera mira dentro para incluir www/1.txt
nuevamente. La primera regla excluye el directorio principal www
pero no en www/1.txt
, y como resultado, www/1.txt
no puede ser " incluido nuevamente ".
Pero para este último, primero git ignora todos los archivos / folers en www
, y luego incluye uno de ellos nuevamente que es www/1.txt
.
Para este ejemplo, las siguientes líneas en la documentación pueden ayudar:
Un prefijo opcional "!" que niega el patrón; cualquier archivo coincidente excluido por un patrón anterior se incluirá nuevamente. No es posible volver a incluir un archivo si se excluye un directorio principal de ese archivo.
Para ignorar todo en un directorio, excepto los archivos punto, puede usar el siguiente patrón .gitignore
en su .gitignore
:
www/[^.]*
Así que no hay necesidad de un .gitignore
adicional, simplemente agrega un archivo .keep
a tu directorio www
.
Solo estoy analizando la documentación, y hasta donde puedo decir, solo difieren en patrones más avanzados, por ejemplo
$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar
Probé lo anterior, y si reemplaza !/foo
con !/foo/*
, de hecho obtiene un resultado diferente.
Nota
foo
Excluirá cualquier archivo foo
, pero
foo/
solo excluirá directorios llamados foo.