Usando .gitignore para ignorar tudo, exceto diretórios específicos

140

Meu problema é que tenho vários sites WordPress no meu repositório git, dos quais desejo confirmar seletivamente apenas o conteúdo de minhas themespastas, ignorando o restante dos arquivos redundantes encontrados no WordPress.

Eu usei arquivos .gitignore para ignorar os tipos de arquivos antes, mas ele pode ser usado ao contrário - ou seja, ignorar tudo, exceto um determinado caminho de pasta?

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

Obrigado-

ATUALIZAR:

Com base nas respostas, fiz o seguinte, mas não está funcionando. Alguma ideia?

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

Eu também tentei as seguintes variações:

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

Nada disso lê minhas themespastas.

Yarin
fonte

Respostas:

133

Aqui está como eu fiz isso - você basicamente tem que percorrer os caminhos, não pode curinga mais de um nível em qualquer direção:

# 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 como você deve permitir explicitamente o conteúdo para cada nível que você deseja incluir. Então, se eu tenho subdiretórios 5 em temas, ainda preciso explicar isso.

Isto é apenas como funcionou para mim. Se alguém se importa em oferecer uma explicação mais informada por todos os meios.

Além disso, essas respostas são úteis:
como-fazer-negado-padrões-trabalhar-em-gitignore
como-fazer-gitignore-exclusão-regras-realmente-trabalho


NOTA: Tentei usar 'globs' com curinga dupla, mas de acordo com isso, a funcionalidade depende do sistema e não funcionou no meu mac:

Não funcionou:

!**/wp-content/themes/
!**/wp-content/themes/**
Yarin
fonte
4
Antes do git 1.8.4, o **curinga funciona apenas se você não tiver barras no seu padrão, consulte sparethought.wordpress.com/2011/07/19/…
Isso deve funcionar:!/wordpress/*/wp-content/themes/**/*
that0n3guy
1
Essa sintaxe funciona no Windows? Não parece estar a trabalhar para mim ...
ScottF
Ele faz maravilhas no Windows 10. Usá-lo para todos os tipos de projetos personalizados do Visual Studio Code.
klewis
Eu usei uma combinação desta resposta e a fornecida por @ 吴毅 凡, que funcionou para mim.
MikeyE
95

Eu tentei o acima e eles não funcionaram tão bem. Uma abordagem melhor é a seguinte: 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
fonte
1
@ dwenaus- obrigado por compartilhar this- parece útil para repos enraizadas em um dir wordpress específico, mas não vai funcionar em repo w vários sites wordpress debaixo dela, que é o que eu estava indo para ..
Yarin
Essa estrutura / modelo é super útil. Eu queria um repositório único para uma instalação combinada do Magento / WP e, com menos de 30 linhas de .gitignore usando essa técnica, consegui reduzi-lo apenas aos arquivos de tema / skin do Magento e aos arquivos de tema do WP. Obrigado!
random_user_name 22/03
apenas não use essa configuração com a implantação automática, porque um usuário iniciante do git pode atrapalhar arquivos fora das áreas recuadas (por exemplo, se eles excluirem todos os arquivos do repositório por acidente e a implantação automática for uma bagunça). Fora isso, funciona bem.
Dwenaus
Você é o cara cara! Especialmente se sua versão for> = 2.1.4. Ref: git-scm.com/docs/gitignore/2.1.4
Haktan Suren
28

modificar a primeira linha

*

mude para

/*
吴毅 凡
fonte
2
Este trabalho para mim. Meu arquivo .gitignore é assim / *! .Gitignore! /
Vendors
12

Tente estas respostas:

Faça o .gitignore ignorar tudo, exceto alguns arquivos

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# ...even if they are in subdirectories
!*/

Como digo ao Git para ignorar tudo, exceto um subdiretório?

Isso ignora os arquivos raiz e os diretórios raiz, e então ignora o diretório da caixa raiz:

/*
/*/
!/bin/

Dessa forma, você obtém todo o diretório bin, incluindo subdiretórios e seus arquivos.

irritar
fonte
@ irritar- Obrigado, não vi esses- no entanto, estou tendo problemas para aplicá-los à minha situação. Veja minhas edições acima ...
Yarin
1
O segundo link que eu postei diz que você precisaria de ambos !*/wp-content/themes/e !*/wp-content/themes/*. Você já tentou essa variação? Além disso, como uma alternativa, você pode simplesmente usar !*/wp-content/themes/e em cada diretório temas têm seu próprio arquivo .gitignore com!*
irritar
1
@ irritate- sem que a variação não quer trabalhar, e mesmo assim eu não vejo como isso seria diferente de!*/wp-content/themes*
Yarin
9

Se você prefixar um padrão com um ponto de exclamação ( !), ele nega qualquer padrão anterior que o exclua. Portanto, presumivelmente, você pode ignorar tudo e permitir apenas o que deseja usando esse padrão.

dappawit
fonte
@ dappawit- Thanks- conceito faz sentido, e eu tenho que trabalhar para arquivos, mas não para os meus temas folders- ver as minhas edições acima ...
Yarin
Eu não sou um especialista em padrões glob, mas lendo a página de manual .gitignore, eu acredito que isso pode funcionar: !wordpress/[write out directories]/wp-content/themes/. Observe a barra de fechamento e nenhum asterisco de fechamento. Observe também que *corresponderá apenas a um nível, não a vários diretórios. Aqui está a página do manual: kernel.org/pub/software/scm/git/docs/gitignore.html
dappawit
Me ajudou a perceber que eu tinha que colocar a negação depois das outras regras, obrigado
Ax
6

Eu precisava ignorar tudo, mas não uma pasta com subdiretórios.

Para mim, isso funciona

# Ignore everything
/*

# Not these directories
!folder/

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

Digamos que você tenha uma estrutura de diretórios como esta:

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

Quando você deseja permitir apenas sites / all / files / private / newsilot e sites / default / files / private / newsilot , primeiro tente o seguinte:

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

Isto está errado! O difícil com o gitignore é que você primeiro deve permitir que o diretório pai ("privado") seja incluído , antes de permitir que o diretório filho ("jornalilot") seja incluído nos commits.

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
fonte
"você precisa primeiro permitir que o diretório pai seja incluído, antes de permitir seu diretório filho" - Obrigado por apontar isso! Foi precisamente o meu problema.
Jet Blue
4

A resposta de Yarin funcionou para mim, aqui está minha versão (não preciso do /wordpresssubdiretório):

*

!.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
fonte
4

Eu sempre fico preso em algum lugar, mesmo depois de voltar a essa pergunta várias vezes. Eu vim com um processo detalhado de fazer isso passo a passo:

Primeiro basta usar git add para adicionar o conteúdo real.

Ele mostra os arquivos relevantes adicionados ao índice, enquanto todos os outros ainda não são rastreados. Isso ajuda a construir .gitignorepasso a passo.

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

Adicione um DUMMY.TXTarquivo temporário ao seu diretório:

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

Nosso objetivo agora é construir as regras para que isso DUMMY.TXT seja a única que ainda esteja aparecendo como Não rastreada quando terminarmos.

Comece a adicionar as regras:

.gitignore

/*

O primeiro é apenas ignorar tudo. Os arquivos não rastreados devem ter desaparecido, apenas os arquivos indexados devem estar mostrando:

$ git status

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

Adicione o primeiro diretório no caminho wp-content

/*
!/wp-content

Agora, os arquivos não rastreados aparecerão novamente, mas apenas wp-contento conteúdo

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

Ignore tudo no primeiro diretório /wp-content/*e não ignore!/wp-content/themes

/*
!/wp-content

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

Agora, os arquivos não rastreados diminuirão ainda mais para apenas 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 o processo até que o arquivo fictício seja o único ainda exibido como Não rastreado:

/*
!/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
atraso
fonte
3

Para quem procura uma solução mais limpa , tente o seguinte.

Como mencionado nos comentários desta resposta, você deve usar esse método recursivamente.

Neste exemplo, você tem uma configuração de site em ./que sua .gitpasta e .gitignorearquivo estão localizados e uma instalação de WordPress ./wordpress. Para ignorar corretamente tudo sob o ./wordpressdiretório, exceto o diretório do tema ( wordpress/wp-content/themes/my-theme), você terá que ignorar recursivamente e permitir cada diretório até o diretório que você deseja permitir:

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

A razão para ignorar com um curinga e permitir (ou ignorar 'além de') o próprio diretório permite que o Git procure dentro do diretório primeiro antes de ignorar tudo o que está dentro. Em seguida, dizemos ao Git para ignorar tudo 'além' do diretório que especificamos. Aqui está a mesma sintaxe, mas na ordem em que o Git está olhando:

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

Espero que isso ajude alguém a entender melhor a necessidade do método recursivo.

Oliver Tappin
fonte
3

atrasado para a festa, mas eis o que eu uso em profundidade desconhecida (a solução aceita requer profundidade conhecida)

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

dessa forma, tudo em conteúdo wp não é ignorado.

Jubair
fonte
3

Depois de precisar disso várias vezes, finalmente encontrei uma solução [1]:

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

Explicação linha por linha:

  1. Ignore todos os diretórios na raiz.
  2. Ignore todos os arquivos com extensões na raiz.
  3. Permita- .gitignorese (e potencialmente .gitattributes).
  4. Permitir o diretório desejado com todos os subdiretórios

[1] Limitações (que eu conheço):

  1. Ele não ignora arquivos sem uma extensão na raiz (e adicionando /* quebraria todo o esquema).
  2. O diretório que você deseja incluir na linha 4 ( wordpressneste caso) não pode ter .o nome (por exemplo wordpress.1, não funcionaria). Se tiver um. , remova a linha 2 e encontre outra maneira de excluir todos os arquivos na raiz.
  3. Testado apenas no Windows com git version 2.17.1.windows.2
Dimagog
fonte
3

Outra solução fácil:

Você deseja ignorar todos os arquivos do Wordpress, mas não o seu tema (por exemplo).

.gitignore , o conteúdo é:

# 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

Neste exemplo, você pode remover o wordpress se .gitignore estiver em diretório raiz do wordpress

Você pode fazer exatamente o mesmo com todas as pastas e conteúdos que deseja "excepcionalmente" manter fora das pastas / arquivos com gitignored

Conclusão:

Certifique-se de desconectar todos os diretórios de um caminho que você deseja desconectar

MAS

Certifique-se de ignorar todo o conteúdo dos diretórios não ignorados que você deseja ignorar

Arthur Bouchard
fonte
2

Você pode tentar isso:

!**/themes/*

Onde :

  • ! : negar ignorar (incluir)
  • **: qualquer árvore de diretórios (recursão) para que você não precise especificar o caminho da pasta
  • temas: sua pasta para incluir (pode ser qualquer coisa)
  • *: qualquer arquivo nessa pasta, você também pode incluir todas as subpastas com ** e, em vez de incluir qualquer arquivo (*), pode ser específico * .css, * .xy
Principal
fonte
2

Aqui está a minha solução, que pressupõe um checkout em 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

e teste:

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

portanto, ignora corretamente tudo o que não quero e nada que queira manter.

Código de Liberação

O Gitlab é configurado com espelhos de repositório para ramificações protegidas, de acordo com https://docs.gitlab.com/ee/workflow/repository_mirroring.html

Quando o código é enviado para uma ramificação protegida, ele é espelhado para os servidores de armazenamento temporário e de produção no /opt/checkout/repo.git/repositório simples. O seguinte post-receivegancho (pol /opt/checkout/repo.git/hooks/post-receive) fará o checkout do código no diretório de trabalho.

#!/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 obter mais informações, consulte https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps

Waddles
fonte
1

Aqui está como eu fiz isso:

# 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

Isto é o que funcionou para mim. Permite ignorar tudo, exceto arquivos ou pastas específicos

macOS sierra

Gaurav Raghuvanshy
fonte
0

Estou no mesmo barco tentando gerenciar um monte de sites do Wordpress sob um repositório. Minha estrutura de diretórios fica assim:

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

Quero apenas rastrear os itens dentro da app/publicpasta para cada site. Eu tentei os exemplos nesta página , bem como algumas das sugestões aqui e acabei tentando o seguinte:

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

que funcionou, mas eu teria que ignorar o mesmo caminho para cada site que estava tentando evitar.

Depois, substituí o nome do site *e isso fez o truque para mim. Então foi isso que acabei usando:

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

Isso efetivamente ignorou tudo na pasta do site enquanto captura tudo na app/publicpasta para qualquer site que eu criei na raiz.

Note que ele não irá ignorar arquivos na raiz, apenas diretórios :)

Espero que isto ajude.

Henry
fonte
0

Este é o único arquivo que é ignorado na maioria dos casos, porque você tem o wp-config-sample.php que pode ser compartilhado com outras pessoas.

/wp-config.php
Jaskaran Singh
fonte