Digamos que he ignorado un directorio, pero quiero dejar de ignorar subdirectorios específicos en él. Entonces tengo la configuración:
/uploads/
/uploads/rubbish/
/uploads/rubbish/stuff/KEEP_ME/
/uploads/foo/
/uploads/foo/bar/lose/
Y quiero ignorar todo menos el KEEP_ME
directorio. Espero que el ignorado se vea así:
/uploads/*
!/uploads/rubbish/stuff/KEEP_ME/
Pero eso no funciona, y tampoco lo son varias permutaciones sobre el mismo tema.
Uno que funciona es
/uploads/**/**/**/
!/uploads/rubbish/stuff/KEEP_ME/
¿Pero eso se siente un poco restrictivo y detallado?
Respuestas:
De acuerdo con la sección de formato de patrón de la documentación de gitignore :
Por lo tanto, el
/uploads/rubbish/stuff/keep/
patrón de directorio padre previamente excluido debe negarse exclusivamente antes de negar su contenido:Para incluir subdirectorios dentro,
/uploads/rubbish/stuff/keep/
agregue la tercera línea:fuente
.gitignore
¡!*.zip
Incluso si agrega algo
.gitignore
, puede forzar a git a agregarlo al índiceSin embargo, "KEEP_ME" parece ser un directorio y a git generalmente no le gusta la carpeta vacía, por lo que debería agregar un archivo de marcador de posición en su lugar, si la carpeta está vacía
fuente
git add --force
para cada nuevo elemento o carpeta enKEEP_ME
. pero después de eso, las actualizaciones simplemente se agregan (cuando se hace,git add -u
por ejemplo) como si los archivos no fueran ignorados. No.keep_me
hace nada, es solo un archivo para que git opere en la carpeta.git add --force
es la solución incorrecta para esto. Si mueve un directorio o mueve el archivo a otro directorio, el seguimiento de git eliminará el archivo pero no lo agregará a la nueva ubicación y tendrá que hacerlogit add --force
nuevamente. al anular la ignorancia de un patrón genérico, git rastreará el movimiento de un archivo dentro del repositorio.Estaba tratando de averiguar cómo incluir una carpeta específica al excluir todas las carpetas con la exclusión genérica
si agrega el
/*
al final de su exclusión genérica, continúa excluyendo todos los archivos de compilación**/build/*
Luego agrega otra línea para corregir la ruta que desea que se incluya para que se vea como
dejándonos un gitignore que lee
fuente
Las respuestas de Buo-Ren Lin y John son bastante útiles, pero necesitaba combinar ambas.
Cuando quería excluir otras subcarpetas, así como archivos dentro de las cargas, encontré necesario especificar explícitamente directorios arbitrarios antes de la carpeta dada, tanto al excluir la carpeta como al incluir la subcarpeta
También me pareció necesario volver a incluir explícitamente tanto la subcarpeta como su contenido para mostrar tanto los elementos dentro de la carpeta como las subcarpetas.
fuente
La solución presentada como la respuesta más votada a favor es incorrecta y fácilmente demostrable como tal.
Comience ignorando todo en las cargas / *:
Ahora deje de ignorar el directorio principal de las cosas ignoradas como arriba:
No muestra archivos sin seguimiento.
Para que funcione, debe ignorar todos los archivos debajo del
uploads/
árbol (uploads/**/*
no solo el nivel superioruploads/*
) y luego agregar todos los directorios principales del árbol que desea conservarLo que da:
Si hubiéramos utilizado
uploads/*
lo.gitignore
anterior, entonces todos los archivos intermedios también se habrían incluido, por lo que, por ejemplouploads/rubbish/a
, aparecerían en el comando de estado anterior.fuente