Usando .gitignore para ignorar todo menos directorios específicos

140

Mi problema es que tengo un montón de sitios web de WordPress en mi repositorio de git, de los cuales quiero confirmar selectivamente solo el contenido de mis themescarpetas, mientras ignoro el resto de los archivos redundantes encontrados en WordPress.

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

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

Gracias-

ACTUALIZAR:

Según las respuestas, hice lo siguiente, pero no funciona. ¿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 themescarpetas.

Yarin
fuente

Respuestas:

133

Así es como lo hice: esencialmente tienes que caminar por los caminos, no puedes usar comodines más 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 incluir. Entonces, si tengo subdirectorios 5 profundos debajo de los temas, todavía necesito explicarlo.

Así es como me funcionó. Si a alguien le importa ofrecer una explicación más informada por todos los medios.

Además, estas respuestas son útiles:
cómo-hacer-patrones-negados-trabajo-en-gitignore
cómo-hacer-gitignore-exclusión-reglas-realmente-trabajo


NOTA: Intenté usar 'globos' con comodines dobles, pero según esto, la funcionalidad depende del sistema y no funcionó en mi Mac:

No funcionó:

!**/wp-content/themes/
!**/wp-content/themes/**
Yarin
fuente
44
antes de git 1.8.4, el **comodín solo funciona si no tiene barras en su patrón, consulte sparethought.wordpress.com/2011/07/19/…
Esto debería funcionar:!/wordpress/*/wp-content/themes/**/*
that0n3guy
1
¿Esta sintaxis funciona en Windows? No parece estar funcionando para mí ...
ScottF
Funciona de maravilla en Windows 10. Utilizándolo para todo tipo de proyectos personalizados de Visual Studio Code.
klewis 05 de
Utilicé una combinación de esta respuesta y la proporcionada por @ 吴毅 凡, que funcionó para mí.
MikeyE
95

Intenté lo anterior y no funcionaron tan bien. Un 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/
dwenaus
fuente
1
@ dwenaus, gracias por compartir esto, parece útil para repos enraizados en un directorio específico de WordPress, pero no funcionará en el repositorio con múltiples sitios de WordPress debajo, que es lo que estaba buscando ...
Yarin
Esta estructura / modelo es muy útil. Quería un único repositorio para una instalación combinada de Magento / WP, y con menos de 30 líneas de .gitignore usando esta técnica, pude reducirlo solo a los archivos de tema / skin de Magento y los archivos de tema de WP. ¡Gracias!
random_user_name
simplemente no use esta configuración con despliegue automático porque un usuario git novato podría desordenar archivos fuera de las áreas sangradas (es decir, si eliminan todos los archivos en el repositorio por accidente y se despliega automáticamente, será desordenado). Aparte de eso, funciona bien.
dwenaus
Eres el hombre amigo! Especialmente si su versión es> = 2.1.4. Ref: git-scm.com/docs/gitignore/2.1.4
Haktan Suren
28

modificar la primera línea

*

cámbielo a

/*
吴毅 凡
fuente
2
Este trabajo para mi. Mi archivo .gitignore es así / *! .Gitignore! /
Vendors
12

Prueba estas respuestas:

Haga que .gitignore ignore todo excepto algunos archivos

# 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 subdirectorio?

Esto ignora los archivos raíz y los directorios raíz, luego ignora el directorio raíz bin:

/*
/*/
!/bin/

De esta forma, obtiene todo el directorio bin, incluidos los subdirectorios y sus archivos.

irritar
fuente
@ irritar- Gracias, no vi estos, sin embargo, estoy teniendo problemas para aplicarlos a mi situación. Vea mis ediciones arriba ...
Yarin
1
El segundo enlace que publiqué dice que necesitarías ambos !*/wp-content/themes/y !*/wp-content/themes/*. ¿Has probado esa variación? Además, como alternativa, puede usar !*/wp-content/themes/y en cada directorio de temas tener su propio archivo .gitignore con!*
irritar el
1
@ irritar, no, esa variación tampoco funciona, y de todos modos no veo cómo eso sería diferente!*/wp-content/themes*
Yarin
9

Si antepone un patrón con un signo de exclamación ( !), se niega cualquier patrón anterior que lo excluya. Entonces, presumiblemente, podrías ignorar todo, luego solo permitir lo que quieras usando este patrón.

dappawit
fuente
@ dappawit- Gracias- el concepto tiene sentido, y lo hice funcionar para archivos, pero no para mis carpetas de temas- vea mis ediciones arriba ...
Yarin
No soy un experto en patrones globales, pero al leer la página del manual .gitignore, creo que esto puede funcionar: !wordpress/[write out directories]/wp-content/themes/. Observe la barra oblicua de cierre y ningún asterisco de cierre. También tenga en cuenta que *solo coincidirá con un nivel, no con varios directorios. Aquí está la página del manual
dappawit
Me ayudó a darme cuenta de que tenía que poner la negación después de las otras reglas, gracias
Hacha
6

Necesitaba ignorar todo menos una carpeta con subdirectorios.

Para mi esto funciona

# Ignore everything
/*

# Not these directories
!folder/

# Not these files
!.gitignore
!.env
!file.txt
Matias Seguel
fuente
5

Digamos que tiene una estructura de directorio como esta:

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

Cuando solo desea permitir sitios / todos / archivos / privado / newspilot y sitios / predeterminado / archivos / privado / newspilot , al principio, puede intentar esto:

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

¡Esto está mal! Lo complicado con gitignore es que primero debe permitir que se incluya el directorio padre ("privado") , antes de permitir que su directorio hijo ("newspilot") se incluya en las confirmaciones.

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

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

Peeter Kokk
fuente
"primero debe permitir que se incluya el directorio principal, antes de que pueda permitir su directorio secundario" - ¡Gracias por señalar esto! Fue precisamente mi problema.
Jet Blue
4

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

*

!.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
cabgfx
fuente
4

Siempre me quedo estancado en alguna parte de esto, incluso después de volver a esta pregunta varias veces. Se me ocurrió un proceso detallado de hacerlo paso a paso:

Primero solo use git addpara agregar el contenido real.

Mostrará los archivos relevantes agregados al índice mientras todos los demás aún no están rastreados. Esto ayuda a construir .gitignorepaso 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 DUMMY.TXTarchivo temporal en su directorio:

$ 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 objetivo ahora es construir las reglas de modo que este DUMMY.TXTsea ​​el único que todavía aparezca como Sin seguimiento cuando hayamos terminado.

Comience a agregar las reglas:

.gitignore

/*

El primero es ignorar todo. Los archivos no rastreados deberían desaparecer, solo deberían mostrarse los archivos 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 directorio en la ruta wp-content

/*
!/wp-content

Ahora los archivos no rastreados volverán a aparecer, pero solo tienen wp-contentel contenido

$ 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/
        ..

Ignorar todo en el primer directorio /wp-content/*y ignorar!/wp-content/themes

/*
!/wp-content

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

Ahora los archivos no rastreados se reducirá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 proceso hasta que ese archivo ficticio sea el único que todavía se muestra 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
laggingreflex
fuente
3

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 de forma recursiva.

En este ejemplo, tiene una configuración de sitio web en ./donde se encuentra su .gitcarpeta y .gitignorearchivo y una configuración de instalación de WordPress ./wordpress. Para ignorar correctamente todo lo que está debajo del ./wordpressdirectorio, aparte del directorio del tema en sí ( wordpress/wp-content/themes/my-theme), deberá ignorar y permitir recursivamente cada directorio hasta el directorio 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 directorio en sí mismo le permite a Git mirar primero dentro del directorio antes de ignorar todo lo que contiene. Luego le decimos a Git que ignore todo 'aparte' del directorio que hemos especificado. Aquí está la misma sintaxis, pero en orden de cómo Git la está mirando:

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

Esperemos que esto ayude a alguien a comprender mejor la necesidad del método recursivo.

Oliver Tappin
fuente
3

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

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

de esta manera no se ignora todo lo que se encuentra debajo de wp-content.

Jubair
fuente
3

Después de necesitar esto varias veces, finalmente encontré una solución [1]:

/*/
/*.*
!.git*
!/wordpress

Explicación línea por línea:

  1. Ignorar todos los directorios en la raíz.
  2. Ignora todos los archivos con extensiones en la raíz.
  3. Permitirse a .gitignoresí mismo (y potencialmente .gitattributes).
  4. Permita el directorio deseado con todos los subdirectorios.

[1] Limitaciones (que yo sepa):

  1. No ignora los archivos sin una extensión en la raíz (y la adición /*rompería todo el esquema).
  2. El directorio que desea incluir en la línea 4 ( wordpressen este caso) no puede tener .en el nombre (por ejemplo wordpress.1, no funcionaría). Si tiene un ., elimine la línea 2 y busque otra forma de excluir todos los archivos en la raíz.
  3. Probado solo en Windows con git version 2.17.1.windows.2
Dimagog
fuente
3

Otra solución fácil:

Desea ignorar todos los archivos de Wordpress, pero no su tema (por ejemplo).

.gitignore , el contenido es:

# All wordpress + content of revert ignored directories
wordpress/*
wordpress/wp-content/*
wordpress/wp-content/themes/*

# Revert ignoring directories
!wordpress/
!wordpress/wp-content/
!wordpress/wp-content/themes/
!wordpress/wp-content/themes/my_theme

En este ejemplo, puede eliminar wordpress si .gitignore está en directorio raíz de wordpress

Puede hacer exactamente lo mismo con todas las carpetas y el contenido que desea mantener "excepcionalmente" fuera de las carpetas / archivos ignorados

Conclusión

Asegúrese de ignorar todos los directorios de una ruta que desea ignorar

PERO

Asegúrese de ignorar todo el contenido de directorios no ignorados que desea ignorar

Arthur Bouchard
fuente
2

Puedes probar esto:

!**/themes/*

Donde :

  • ! : negar ignorar (incluir)
  • **: cualquier árbol de directorios (recursividad) para que no tenga que especificar su ruta de carpeta
  • temas: su carpeta para incluir (puede ser cualquier cosa)
  • *: cualquier archivo en esa carpeta, puede incluir todas las subcarpetas también con ** y en lugar de incluir cualquier archivo (*) puede ser específico * .css, * .xy
Mayor
fuente
2

Aquí está mi solución, que supone un pago en wp-content

# Ignore everything except directories
*
!*/

# except everything in the child theme and its required plugin
!/themes/mytheme-child/**
!/plugins/my-plugin/**

# and this file
!.gitignore

y pruebas:

git version 2.20.1 (Apple Git-117)
$ git check-ignore -v .foo foo foo/ themes/foo themes/foo/bar themes/mytheme-child \
themes/mytheme-child/foo plugins/foo plugins/my-plugin plugins/my-plugin/foo .gitignore
.gitignore:2:*  .foo
.gitignore:2:*  foo
.gitignore:2:*  foo/
.gitignore:2:*  themes/foo
.gitignore:2:*  themes/foo/bar
.gitignore:2:*  themes/mytheme-child
.gitignore:6:!/themes/mytheme-child/**  themes/mytheme-child/foo
.gitignore:2:*  plugins/foo
.gitignore:2:*  plugins/my-plugin
.gitignore:7:!/plugins/my-plugin/** plugins/my-plugin/foo
.gitignore:10:!.gitignore   .gitignore

así que ignora correctamente todo lo que no quiero y nada que quiera conservar.

Código de liberación

Gitlab está configurado con espejos de repositorio para ramas protegidas, de acuerdo con https://docs.gitlab.com/ee/workflow/repository_mirroring.html

Cuando el código se inserta en una rama protegida, se duplica en los estadificación y de producción los servidores de la /opt/checkout/repo.git/cesión temporal al descubierto. El siguiente post-receiveenlace (in /opt/checkout/repo.git/hooks/post-receive) luego pasará el código al directorio de trabajo.

#!/bin/bash

BRANCH=staging
GIT_DIR=/opt/checkout/repo.git
GIT_WORK_TREE=/opt/bitnami/apps/wordpress/htdocs/wp-content

# on push, checkout the code to the working tree
git checkout -f "${BRANCH}"

# ensure permissions are correct
sudo chown -R bitnami:daemon "${GIT_WORK_TREE}"
sudo chmod -R go-w "${GIT_WORK_TREE}"

Para obtener más información, consulte https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps

Waddles
fuente
1

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 archivos o carpetas específicos

macOS sierra

Gaurav Raghuvanshy
fuente
0

Estoy en el mismo barco tratando de administrar un montón de sitios de Wordpress en un solo repositorio. La estructura de mi directorio 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

Solo quiero rastrear los elementos dentro de la app/publiccarpeta 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 la misma ruta para cada sitio que estaba tratando de evitar.

Luego simplemente reemplacé el nombre del sitio con *y eso fue el truco para mí. Entonces esto es lo que terminé usando:

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

Esto efectivamente ignoró todo en la carpeta del sitio mientras capturaba todo en la app/publiccarpeta para cualquier sitio que creara en la raíz.

Tenga en cuenta que no ignorará los archivos en la raíz, solo los directorios :)

Espero que esto ayude.

Enrique
fuente
0

Este es el único archivo que se ignora en la mayoría de los casos, porque tiene wp-config-sample.php que puede compartir con otros.

/wp-config.php
Jaskaran Singh
fuente