usar una subfolders omitir ignorar excluir como comando carpetas carpeta and git gitignore

una - ignorar carpetas en git



¿Cómo funcionan las reglas de exclusión de gitignore? (5)

Estoy tratando de resolver un problema de gitignore en una gran estructura de directorios, pero para simplificar mi pregunta, la he reducido a lo siguiente.

Tengo la siguiente estructura de directorio de dos archivos (foo, bar) en un nuevo repositorio de git (sin compromisos hasta el momento):

a/b/c/foo a/b/c/bar

Obviamente, un ''estado de git -u'' muestra:

# Untracked files: ... # a/b/c/bar # a/b/c/foo

Lo que quiero hacer es crear un archivo .gitignore que ignore todo dentro de / b / c pero no ignore el archivo ''foo''.

Si creo un .gitignore así:

c/

Luego, un ''estado de git -u'' muestra tanto foo como la barra como ignorados:

# Untracked files: ... # .gitignore

Que es lo que espero.

Ahora si agrego una regla de exclusión para foo, entonces:

c/ !foo

De acuerdo con la página de manual de gitignore, espero que esto funcione. Pero no lo hace, todavía ignora foo:

# Untracked files: ... # .gitignore

Esto tampoco funciona:

c/ !a/b/c/foo

Tampoco esto:

c/* !foo

Da:

# Untracked files: ... # .gitignore # a/b/c/bar # a/b/c/foo

En ese caso, aunque foo ya no se ignora, la barra tampoco se ignora.

El orden de las reglas en .gitignore tampoco parece importar.

Esto tampoco hace lo que esperaba:

a/b/c/ !a/b/c/foo

Ese ignora tanto foo como bar.

Una situación que funciona es si creo el archivo a / b / c / .gitignore y lo coloco allí:

* !foo

Pero el problema con esto es que eventualmente habrá otros subdirectorios bajo a / b / c y no quiero tener que poner un .gitignore por separado en cada uno de ellos - Tenía la esperanza de crear ''.gitignore basado en proyectos'' archivos que pueden ubicarse en el directorio superior de cada proyecto y que cubren toda la estructura del subdirectorio ''estándar''.

Esto también parece ser equivalente:

a/b/c/* !a/b/c/foo

Esto podría ser lo más cercano a "trabajar" que puedo lograr, pero es necesario establecer las rutas relativas completas y las excepciones explícitas, lo que será un dolor si tengo muchos archivos de nombre ''foo'' en diferentes niveles del árbol subdirectorio.

De todos modos, o no entiendo muy bien cómo funcionan las reglas de exclusión, o no funcionan en absoluto cuando se ignoran los directorios (en lugar de los comodines) mediante una regla que termina en un /

¿Alguien puede por favor arrojar algo de luz sobre esto?

¿Hay alguna manera de hacer que gitignore use algo sensato como las expresiones regulares en lugar de esta sintaxis torpe basada en shell?

Estoy usando y observo esto con git-1.6.6.1 en Cygwin / bash3 y git-1.7.1 en Ubuntu / bash3.


Aquí hay otra opción:

* !/a* !/a/* !/a/*/* !/a/*/*/*

Eso ignoraría todos los archivos y directorios, excepto los archivos / directorios de tres niveles profundos dentro de a.



Tengo una situación similar, mi solución fue usar:

/a/**/* !/a/**/foo

Eso debería funcionar para una cantidad arbitraria de directorios intermedios si leo ** correctamente.


esto definitivamente no está claro en la página de manual de .gitignore. Esto funciona:

* !/a !/a/b !/a/b/c !/a/b/c/foo # don''t forget this one !.gitignore

Como lo menciona Chris, un directorio ni siquiera se abre si se excluye. Entonces, si desea poder ignorar * pero algunos archivos, debe compilar la ruta a esos archivos como se indicó anteriormente. Para mí, esto es conveniente, porque quiero hacer una revisión de código en 1 archivo de una biblioteca y si quiero hacer otra más adelante, simplemente lo agrego, y todo lo demás se ignora.


/a/b/c/* !foo

Parece que funciona para mí (git 1.7.0.4 en Linux). El * es importante, ya que de lo contrario está ignorando el directorio en sí (para que git no mire adentro) en lugar de los archivos dentro del directorio (lo que permite la exclusión).

Piense en las exclusiones diciendo "pero no esta" en lugar de "pero incluya esto" - "ignore este directorio ( /a/b/c/ ) pero no este ( foo )" no tiene mucho sentido; "ignore todos los archivos en este directorio ( /a/b/c/* ) pero no este ( foo )". Para citar la página man:

Un prefijo opcional! que niega el patrón; cualquier archivo coincidente excluido por un patrón anterior se incluirá nuevamente.

es decir, el archivo debe haberse excluido para volver a incluirse. Espero que arroje algo de luz.