usar rastreados para ignorar example ejemplo crear como comando carpetas cambios archivo git gitignore

rastreados - gitignore: ignorar todos los archivos en la jerarquía de carpetas excepto un tipo de archivo específico



gitignore example (3)

Me gustaría ignorar todos los archivos a continuación y en una carpeta, excepto un tipo de archivo específico que podría estar en algún lugar de la jerarquía de carpetas:

Ejemplo

/Test /Test/unknown/folder/structure/below

Ahora me gustaría ignorar todos los archivos en y debajo de la carpeta de Test excepto un determinado archivo css llamado layout.css , por ejemplo:

/Test/layout.css /Test/fileto.ignore /Test/another/folder/ig.nore /Test/in/a/unknown/folder/layout.css /Test/in/a/unknown/folder/ignore.me

.gitignore debería ignorar

/Test/fileto.ignore /Test/another/folder/ig.nore /Test/in/a/unknown/folder/ignore.me

Mi archivo .gitignore no funciona:

Test/ !layout.css

¿Alguna sugerencia?


Para lograr lo que desea, necesitará usar algunas exclusiones negativas.

La idea básica es que debe excluir todos los directorios principales de cualquier archivo que desee desmarcar.

Por lo tanto, si desea que /Test/in/a/unknown/folder/layout.css se agregue a su repositorio de git, entonces tendrá que desactivar / Test /, / Test / in /, / Test / in / a /, / Test / in / a / unknown /, y / Test / in / a / unknown / folder /.

Luego, cuando finalmente llegue al directorio con algunos archivos ignorados y otros no identificados, deberá especificar cada uno individualmente de la siguiente manera:

# Fille: .gitignore !Test/ Test/* !Test/layout.css Test/fileto.ignore !Test/another/ Test/another/* !Test/another/folder/ Test/another/folder/* !Test/in/ Test/in/* !Test/in/a/ Test/in/a/* !Test/in/a/unknown/ Test/in/a/unknown/* !Test/in/a/unknown/folder/ Test/in/a/unknown/folder/ignore.me !Test/in/a/unknown/folder/layout.css

Entonces, cuando ejecute $ git add-all verá los resultados deseados:

$ git status On branch master Initial commit Changes to be committed: (use "git rm --cached <file>..." to unstage) new file: .gitignore new file: Test/in/a/unknown/folder/layout.css new file: Test/layout.css

Nota: puede encontrar una explicación de por qué git add-all es la mejor manera de agregar archivos a un repositorio de git en http://lexsheehan.blogspot.com/2014/05/git-add-update.html


Pregunta bastante antigua, pero como estaba teniendo problemas con este problema, incluso ahora pensé que compartiría la solución real al problema.

La cosa es que, si bien no puede cometer directorios vacíos en Git como si se ignoraran, esta regla no se aplica a .gitignore .

Desde https://git-scm.com/docs/gitignore

Un "/ **" al final coincide con todo lo que hay dentro . Por ejemplo, "abc / **" coincide con todos los archivos dentro del directorio "abc", en relación con la ubicación del archivo .gitignore, con profundidad infinita.

Una barra seguida de dos asteriscos consecutivos y luego una barra coincide con cero o más directorios. Por ejemplo, "a / ** / b" coincide con "a / b", "a / x / b", "a / x / y / b" y así sucesivamente.

** Coincide con todo dentro - literalmente todo - archivos Y directorios.

Esto nos lleva a otro punto en los documentos gitignore:

Un prefijo opcional "!" lo 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. Git no enumera los directorios excluidos por razones de rendimiento, por lo que cualquier patrón en los archivos contenidos no tiene efecto, sin importar dónde estén definidos. Coloque una barra invertida ("/") delante de la primera "!" para patrones que comienzan con un literal "!", por ejemplo, "! important! .txt".

Si el patrón termina con una barra diagonal, se elimina para los fines de la siguiente descripción, pero solo encontraría una coincidencia con un directorio. En otras palabras, foo / coincidirá con un directorio foo y las rutas debajo de él, pero no coincidirá con un archivo normal o un enlace simbólico foo (esto es consistente con la forma en que Pathspec funciona en general en Git).

Ahora, digamos que tenemos una estructura de directorio siguiente:

/path/to/git/repo |-- .gitignore |-- /cache |-- somefile |-- README |-- /dir |-- somefile2 |-- README

Y queremos ignorar todos los archivos dentro de la caché / excepto los archivos README.

Si especificamos gitignore como este:

/cache/** !README

Git ignorará todo excepto por /cache/README . El otro README no se mostrará porque su directorio /cache/dir fue excluido con /cache/** y !README ni siquiera se aplicará a él. Para resolver el problema necesitamos especificar gitignore como esto:

# Ignore everything inside cache/ dir /cache/** # Except for subdirectories(won''t be commited anyway if there is no commited file inside) !/cache/**/ # And except for README files !README


Pude hacer que su ejemplo funcione al poner un archivo .gitignore en el directorio de Test/ con el siguiente contenido.

* !*/ !.gitignore !layout.css