usar una omitir ignorar funciona example como comando carpetas carpeta git gitignore notation dotfiles

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.