Usar .gitignore para ignorar todo less directorys específicos

Mi problema es que tengo un montón de sitios web de WordPress en mi repository git, de los cuales quiero comprometer selectivamente solo el contenido de mis carpetas de themes , mientras ignoro el rest de los files networkingundantes encontrados en WordPress.

He usado files .gitignore para ignorar los types de files anteriormente, pero ¿se puede usar al revés, es decir, ignorar todo, PERO una determinada ruta de carpeta?

root (git repo)
– / wordpress
– – / (Sitio de WordPress 1) / wp-content / themes
– – / (Sitio de WordPress 2) / wp-content / themes
– – / (Sitio de WordPress 3) / wp-content / themes

Gracias-

ACTUALIZAR:

Basado en las respuestas, hice lo siguiente, pero no está funcionando. ¿Algunas ideas?

 # Ignore everything: * # Except for wordpress themes: !*/wp-content/themes/* 

También probé las siguientes variaciones:

 !*/wp-content/themes* !*wp-content/themes/* !wp-content/themes/* !/wordpress/*/wp-content/themes* !wordpress/*/wp-content/themes* 

Ninguno de estos lee mis carpetas de themes .

Así es como lo hice – esencialmente tienes que caminar por los paths, no puedes ir más allá de un nivel en cualquier dirección:

 # Ignore everything: * # Except for the themes directories: !wordpress/ !wordpress/*/ !wordpress/*/wp-content/ !wordpress/*/wp-content/themes/ !wordpress/*/wp-content/themes/* !wordpress/*/wp-content/themes/*/* !wordpress/*/wp-content/themes/*/*/* !wordpress/*/wp-content/themes/*/*/*/* !wordpress/*/wp-content/themes/*/*/*/*/* 

Observe cómo debe permitir explícitamente el contenido para cada nivel que desee include. Entonces, si tengo subdirectorys 5 muy por debajo de los temas, aún necesito deletrear eso.

Esto es solo lo que funcionó para mí. Si alguien se preocupa por ofrecer una explicación más informada por todos los medios.

Además, estas respuestas útiles:
how-do-negated-patterns-work-in-gitignore
how-do-gitignore-exclusion-rules-actually-work


NOTA: Intenté utilizar 'comodines' de doble comodín, pero según esto, la funcionalidad depende del sistema y no funcionaba en mi mac:

No funcionó:

 !**/wp-content/themes/ !**/wp-content/themes/** 

Intenté lo anterior y no funcionaron tan bien. MUCHO mejor enfoque es el siguiente desde aquí: https://gist.github.com/444295

 # This is a template .gitignore file for git-managed WordPress projects. # # Fact: you don't want WordPress core files, or your server-specific # configuration files etc., in your project's repository. You just don't. # # Solution: stick this file up your repository root (which it assumes is # also the WordPress root directory) and add exceptions for any plugins, # themes, and other directories that should be under version control. # # See the comments below for more info on how to add exceptions for your # content. Or see git's documentation for more info on .gitignore files: # http://kernel.org/pub/software/scm/git/docs/gitignore.html # Ignore everything in the root except the "wp-content" directory. /* !.gitignore !wp-content/ # Ignore everything in the "wp-content" directory, except the "plugins" # and "themes" directories. wp-content/* !wp-content/plugins/ !wp-content/themes/ # Ignore everything in the "plugins" directory, except the plugins you # specify (see the commented-out examples for hints on how to do this.) wp-content/plugins/* # !wp-content/plugins/my-single-file-plugin.php # !wp-content/plugins/my-directory-plugin/ # Ignore everything in the "themes" directory, except the themes you # specify (see the commented-out example for a hint on how to do this.) wp-content/themes/* # !wp-content/themes/my-theme/ 

Si prefijas un patrón con un signo de exclamación ( ! ), Se anula cualquier patrón anterior que lo haya excluido. Entonces, presumiblemente, podrías ignorar todo y luego solo permitir lo que quieras usando este patrón.

modificar la primera línea

 * 

cambiarlo a

 /* 

Pruebe estas respuestas:

Haga que .gitignore ignore todo, excepto algunos files

 # Ignore everything * # But not these files... !.gitignore !script.pl !template.latex # etc... # ...even if they are in subdirectories !*/ 

¿Cómo le digo a Git que ignore todo excepto un subdirectory?

Esto ignora los files raíz y los directorys raíz, luego ignora el directory raíz del bin:

 /* /*/ !/bin/ 

De esta forma, obtiene todo el directory bin, incluidos los subdirectorys y sus files.

La respuesta de Yarin funcionó para mí, aquí está mi versión (no necesito el subdirectory /wordpress ):

 * !.gitignore !/wp-content/ !/wp-content/themes/ !/wp-content/themes/* !/wp-content/themes/*/* !/wp-content/themes/*/*/* !/wp-content/themes/*/*/*/* !/wp-content/themes/*/*/*/*/* # I don't want to track this one, so it's included here, after the negated patterns. wp-content/themes/index.php 

Para aquellos que buscan una solución más limpia , intente lo siguiente.

Como se menciona en los comentarios de esta respuesta, debe usar este método recursivamente.

En este ejemplo, tiene una configuration de website en ./ donde se encuentra su file .git y .gitignore file .gitignore y una installation de WordPress en ./wordpress . Para ignorar correctamente todo lo que se encuentra debajo del directory ./wordpress además del directory de temas en sí ( wordpress/wp-content/themes/my-theme ), deberá ignorar recursivamente y permitir que cada directory suba hasta el directory que desea permitir:

 wordpress/* wordpress/wp-content/* wordpress/wp-content/themes/* !wordpress/wp-content !wordpress/wp-content/themes !wordpress/wp-content/themes/my-theme 

La razón para ignorar con un comodín y permitir (o ignorar "aparte de") el directory en sí le permite a Git mirar primero dentro del directory antes de ignorar todo lo que contiene. Luego le decimos a Git que ignore todo "aparte de" el directory que hemos especificado. Aquí está la misma syntax, pero en order de cómo lo está viendo Git:

 wordpress/* # Ignore everything inside here !wordpress/wp-content # Apart from this directory wordpress/wp-content/* # Ignore everything inside here !wordpress/wp-content/themes # Apart from this directory wordpress/wp-content/themes/* # Ignore everything inside here !wordpress/wp-content/themes/my-theme # Apart from this directory 

Con suerte, esto ayuda a alguien a entender mejor la necesidad del método recursivo.

Supongamos que tiene una estructura de directorys como esta:

 – sites – -all – – – -files – – – – – -private – – – – – – – -newspilot – -default – – – -files – – – – – -private – – – – – – – -newspilot 

Cuando solo quiere permitir sitios / all / files / private / newspilot y sites / default / files / private / newspilot , al principio puede intentar esto:

 sites/*/files/* !sites/*/files/private/newspilot 

¡Esto está mal! Lo difícil de gitignore es que primero debe permitir que se incluya el directory principal ("privado") , antes de que pueda permitir que su directory secundario ("newspilot") se incluya en commits.

 sites/*/files/* !sites/*/files/private sites/*/files/private/* !sites/*/files/private/newspilot 

http://www.christianengvall.se/gitignore-exclude-folder-but-include-a-subfolder/

tarde a la fiesta, pero esto es lo que uso para profundidad desconocida (la solución aceptada requiere profundidad conocida)

 /* !.gitignore !wp-content/ !*/ 

de esta forma, todo lo que se encuentre bajo wp-content no se ignora.

Siempre me quedo atorado en alguna parte de esto incluso después de volver a esta pregunta en numerosas ocasiones. He venido con un process detallado de hacerlo paso a paso:

Primero simplemente use git add para agregar el contenido real.

Mostrará los files relevantes agregados al índice, mientras que los demás aún no se rastrearon. Esto ayuda a build .gitignore paso a paso.

 $ git add wp-content/themes/my-theme/* $ git status Changes to be committed: new file: wp-content/themes/my-theme/index.php new file: wp-content/themes/my-theme/style.css Untracked files: wp-admin/ wp-content/plugins/ wp-content/themes/twentyeleven/ wp-content/themes/twentytwelve/ ... wp-includes/ ... 

Agregue un file DUMMY.TXT temporal en su directory:

 $ git status Changes to be committed: new file: wp-content/themes/my-theme/index.php new file: wp-content/themes/my-theme/style.css Untracked files: wp-admin/ wp-content/plugins/ wp-content/themes/twentyeleven/ wp-content/themes/twentytwelve/ ... wp-content/themes/my-theme/DUMMY.TXT <<< ... wp-includes/ ... 

Nuestro objective ahora es build las reglas para que este DUMMY.TXT sea ​​el único que siga apareciendo como No rastreado cuando hayamos terminado.

Comience a agregar las reglas:

.gitignore

 /* 

El primero es simplemente ignorar todo. Los files sin seguimiento deberían desaparecer, solo deberían mostrarse los files indexados:

 $ git status Changes to be committed: new file: wp-content/themes/my-theme/index.php new file: wp-content/themes/my-theme/style.css 

Agregue el primer directory en la ruta wp-content

 /* !/wp-content 

Ahora los files Untracked se mostrarán nuevamente, pero solo tendrán wp-content

 $ git status Changes to be committed: new file: wp-content/themes/my-theme/index.php new file: wp-content/themes/my-theme/style.css Untracked files: wp-content/plugins/ wp-content/themes/twentyeleven/ wp-content/themes/twentytwelve/ .. 

Ignora todo en el primer dir /wp-content/* y un-ignore !/wp-content/themes

 /* !/wp-content /wp-content/* !/wp-content/themes 

Ahora los files sin seguimiento se networkingucirán aún más a solo wp-content/themes

 $ git status Changes to be committed: new file: wp-content/themes/my-theme/index.php new file: wp-content/themes/my-theme/style.css Untracked files: wp-content/themes/twentyeleven/ wp-content/themes/twentytwelve/ .. 

Repita el process hasta que ese file ficticio sea el único que aún se muestre como Sin seguimiento:

 /* !/wp-content /wp-content/* !/wp-content/themes /wp-content/themes/* !/wp-content/themes/my-theme 

 $ git status Changes to be committed: new file: wp-content/themes/my-theme/index.php new file: wp-content/themes/my-theme/style.css Untracked files: wp-content/themes/my-theme/DUMMY.TXT 

Así es como lo hice:

 # Ignore everything at root: /* # Except for directories: !wordpress/(WordPress Site 1)/wp-content/themes/ !wordpress/(WordPress Site 1)/wp-content/themes/ !wordpress/(WordPress Site 1)/wp-content/themes/ # Except files: !README #Except files of type: !*.txt 

Esto es lo que funcionó para mí. Le permite ignorar todo, excepto files o carpetas específicos

macOS sierra

Estoy en el mismo barco tratando de administrar un montón de sitios de WordPress en un repo. Mi estructura de directory se ve así:

 root (git repo) (WordPress Site 1)/app/public/wp-content/themes (WordPress Site 2)/app/public/wp-content/themes (WordPress Site 3)/app/public/wp-content/themes 

Quiero simplemente rastrear los elementos dentro de la app/public carpeta app/public para cada sitio. Probé las muestras en esta página , así como algunas de las sugerencias aquí y terminé intentando esto:

 /(WordPress Site 1)/* !(WordPress Site 1)/app (WordPress Site 1)/app/* !(WordPress Site 1)/app/public 

que funcionó, pero tendría que ignorar el mismo path para cada sitio que intentaba evitar.

Luego acabo de replace el nombre del sitio con * y eso me solucionó el problema. Así que esto es lo que terminé usando:

 /*/* !*/app */app/* !*/app/public 

Esto efectivamente ignoró todo en la carpeta del sitio al capturar todo en la app/public carpeta app/public para cualquier sitio que creé en la raíz.

Tenga en count que no ignorará los files en la raíz, solo los directorys 🙂

Espero que esto ayude.