Utilizzando .gitignore per ignorare tutto tranne directory specifiche


140

Il mio problema è che ho un sacco di siti Web WordPress nel mio repository git, di cui voglio impegnare selettivamente solo il contenuto delle mie themescartelle, ignorando il resto dei file ridondanti trovati in WordPress.

Ho usato i file .gitignore per ignorare i tipi di file prima, ma può essere usato viceversa, cioè ignorare tutto MA un determinato percorso di cartella?

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

Grazie-

AGGIORNARE:

Sulla base delle risposte ho fatto quanto segue, ma non funziona. Qualche idea?

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

Ho anche provato le seguenti varianti:

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

Nessuno di questi legge le mie themescartelle.

Risposte:


133

Ecco come l'ho fatto: essenzialmente devi percorrere i percorsi, non puoi jolly più di un livello in qualsiasi direzione:

# 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/*/*/*/*/*

Nota come devi consentire esplicitamente il contenuto per ogni livello che desideri includere. Quindi, se ho sottodirectory 5 temi profondi, devo ancora precisarlo.

Questo è solo il modo in cui ha funzionato per me. Se qualcuno si preoccupa di offrire una spiegazione più informata con tutti i mezzi.

Inoltre, queste risposte sono utili:
how-do-negated-patterns-work-in-gitignore
how-do-gitignore-esclusion-regole-effettivamente-funziona


NOTA: ho provato a usare 'globs' a doppio jolly, ma in base a ciò la funzionalità dipende dal sistema e non ha funzionato sul mio mac:

Non ha funzionato:

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

4
prima di git 1.8.4 il **carattere jolly funziona solo se non ci sono barre nella sequenza, vedi sparethought.wordpress.com/2011/07/19/…

Questo dovrebbe funzionare:!/wordpress/*/wp-content/themes/**/*
that0n3guy

1
Questa sintassi funziona su Windows? Non sembra funzionare per me ...
ScottF

Funziona a meraviglia su Windows 10. Usandolo per tutti i tipi di progetti personalizzati da Visual Studio Code.
Klewis,

Ho usato una combinazione di questa risposta e quella fornita da @ 吴毅 凡, che ha funzionato per me.
MikeyE,

95

Ho provato quanto sopra e non hanno funzionato così bene. Un approccio migliore è il seguente da qui: 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/

1
@ dwenaus- grazie per aver condiviso questo- sembra utile per i repository radicati in una directory wordpress specifica, ma non funzionerà su repository con più siti wordpress sottostanti, che è quello che stavo cercando ..
Yarin

Questa struttura / modello è super utile. Volevo un singolo repository per un'installazione combinata di Magento / WP e con meno di 30 righe di .gitignore usando questa tecnica, sono stato in grado di restringerlo solo ai file di temi / skin di Magento e ai file di temi di WP. Grazie!
random_user_name

semplicemente non usare questa configurazione con auto-deploy perché un utente git inesperto potrebbe incasinare i file al di fuori delle aree rientrate (ad es. se cancellano tutti i file nel repository per errore e che viene distribuito automaticamente sarà disordinato). Diverso da quello che funziona bene.
dwenaus

Sei l'uomo amico! Soprattutto se la tua versione è> = 2.1.4. Rif: git-scm.com/docs/gitignore/2.1.4
Haktan Suren

28

modifica la prima riga

*

cambiarlo in

/*

2
Questo lavoro per me. Il mio file .gitignore è così / *! .Gitignore! /
Vendors

12

Prova queste risposte:

Fai in modo che .gitignore ignori tutto tranne alcuni file

# Ignore everything
*

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

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

Come posso dire a Git di ignorare tutto tranne una sottodirectory?

Ciò ignora i file root e le directory root, quindi ignora la directory bin bin:

/*
/*/
!/bin/

In questo modo ottieni tutta la directory bin, comprese le sottodirectory e i loro file.


@ irritate- Grazie, non li ho visti, tuttavia, ho problemi ad applicarli alla mia situazione. Vedi le mie modifiche sopra ...
Yarin

1
Il secondo link che ho pubblicato dice che avresti bisogno di entrambi !*/wp-content/themes/e !*/wp-content/themes/*. Hai provato quella variante? Inoltre, in alternativa, puoi semplicemente usare !*/wp-content/themes/e in ogni directory dei temi hai il proprio file .gitignore con!*
irrita il

1
@ irrita- no, neanche quella variazione funziona, e comunque non vedo come sarebbe diverso da!*/wp-content/themes*
Yarin

9

Se si antepone un modello con un punto esclamativo ( !), si annulla qualsiasi modello precedente che lo escludeva. Quindi, presumibilmente, potresti ignorare tutto, quindi consentire solo ciò che desideri utilizzando questo modello.


@ dappawit- Grazie- il concetto ha un senso, e l'ho fatto funzionare per i file, ma non per le cartelle dei miei temi- vedi le mie modifiche sopra ...
Yarin

Io non sono un esperto di modelli di glob, ma leggendo la pagina man .gitignore, credo che questo può funzionare: !wordpress/[write out directories]/wp-content/themes/. Notare la barra di chiusura e nessun asterisco di chiusura. Si noti inoltre che *corrisponderà a un solo livello, non a più directory. Ecco la pagina man: kernel.org/pub/software/scm/git/docs/gitignore.html
dappawit

Mi ha aiutato a capire che dovevo mettere la negazione dopo le altre regole grazie
Ascia

6

Avevo bisogno di ignorare tutto, ma non una cartella con le sottodirectory.

Per me funziona

# Ignore everything
/*

# Not these directories
!folder/

# Not these files
!.gitignore
!.env
!file.txt

5

Supponi di avere una struttura di directory come questa:

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

Quando si desidera consentire solo siti / all / files / private / newspilot e siti / default / files / private / newspilot , all'inizio si può provare questo:

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

Questo è sbagliato! La cosa difficile con gitignore è che devi prima consentire l'inclusione della directory principale ("privata") , prima di poter includere la sua directory secondaria ("newspilot") nelle commit.

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

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


"devi prima consentire l'inclusione della directory principale, prima di poter consentire la sua directory figlio" - Grazie per averlo segnalato! Era proprio il mio problema.
Jet Blue

4

La risposta di Yarin ha funzionato per me, ecco la mia versione (non ho bisogno della /wordpresssottodirectory):

*

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

4

Rimango sempre bloccato da qualche parte su questo anche dopo essere tornato a questa domanda numerose volte. Ho escogitato un processo dettagliato per farlo passo dopo passo:

Prima basta usare git add per aggiungere il contenuto effettivo.

Mostrerà i file rilevanti aggiunti all'indice mentre tutti gli altri sono ancora non tracciati. Questo aiuta a contrattare .gitignorepasso dopo 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/
        ...

Aggiungi un DUMMY.TXTfile temporaneo nella tua 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/
        ...

Il nostro obiettivo ora è quello di costruire le regole in modo tale DUMMY.TXT sia l'unica che non viene ancora visualizzata come non tracciata quando abbiamo finito.

Inizia ad aggiungere le regole:

.gitignore

/*

Il primo è solo quello di ignorare tutto. I file non tracciati dovrebbero essere andati tutti, solo i file indicizzati dovrebbero mostrare:

$ git status

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

Aggiungi la prima directory nel percorso wp-content

/*
!/wp-content

Ora i file non tracciati verranno nuovamente visualizzati, ma avranno solo wp-contenti contenuti

$ 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 tutto nella prima directory /wp-content/*e ignora!/wp-content/themes

/*
!/wp-content

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

Ora i file non tracciati si restringono ulteriormente 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/
        ..

Ripeti il ​​processo fino a quando quel file fittizio è l'unico che viene ancora visualizzato come Non tracciato:

/*
!/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

3

Per chi cerca un detergente soluzione , provare quanto segue.

Come menzionato nei commenti di questa risposta, è necessario utilizzare questo metodo in modo ricorsivo.

In questo esempio, hai un'impostazione del sito Web in ./cui si trovano la .gitcartella e il .gitignorefile e un'installazione dell'installazione di WordPress ./wordpress. Per ignorare correttamente tutto sotto la ./wordpressdirectory a parte la directory dei temi stessa ( wordpress/wp-content/themes/my-theme), dovrai ignorare ricorsivamente e consentire ogni directory fino alla directory che desideri consentire:

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

Il motivo per cui si ignora con un carattere jolly e si consente (o si ignora 'a parte') la directory stessa consente a Git di guardare all'interno della directory prima di ignorare tutto ciò che contiene. Quindi diciamo a Git di ignorare tutto 'tranne' dalla directory che abbiamo specificato. Ecco la stessa sintassi ma in ordine di come Git la sta guardando:

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

Speriamo che questo aiuti qualcuno a capire meglio la necessità del metodo ricorsivo.


3

in ritardo alla festa, ma ecco quello che uso per profondità sconosciuta (la soluzione accettata richiede profondità nota)

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

in questo modo tutto ciò che è sotto wp-content non viene ignorato.


3

Dopo averne avuto più volte bisogno, ho finalmente trovato una soluzione [1]:

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

Spiegazione riga per riga:

  1. Ignora tutte le directory nella radice.
  2. Ignora tutti i file con estensioni alla radice.
  3. Consentire .gitignorese stesso (e potenzialmente.gitattributes ).
  4. Consentire la directory desiderata con tutte le sottodirectory

[1] Limitazioni (di cui sono a conoscenza):

  1. Non ignora i file senza estensione nella radice (e aggiunta /* interromperebbe l'intero schema).
  2. La directory che si desidera includere nella riga 4 ( wordpressin questo caso) non può avere .nel nome (ad es. wordpress.1Non funzionerebbe). Se ha un. , quindi rimuovere la riga 2 e trovare un altro modo per escludere tutti i file nella radice.
  3. Testato solo su Windows con git version 2.17.1.windows.2

3

Un'altra soluzione semplice:

Vuoi ignorare tutti i file di Wordpress, ma non il tuo tema (ad esempio).

.gitignore , il contenuto è:

# 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

In questo esempio, è possibile rimuovere wordpress se .gitignore si trova nella directory principale di wordpress

Puoi fare esattamente lo stesso con ogni cartella e contenuto che desideri "eccezionalmente" tenere fuori da cartelle / file gitignored

Conclusione :

Assicurati di annullare l'annullamento di tutte le directory di un percorso che desideri annullare

MA

Assicurarsi di ignorare tutto il contenuto delle directory non firmate che si desidera ignorare


2

Puoi provare questo:

!**/themes/*

Dove :

  • ! : negate ignore (include)
  • **: qualsiasi albero di directory (ricorsione), quindi non è necessario specificare il percorso della cartella
  • temi: la cartella da includere (può essere qualsiasi cosa)
  • *: qualsiasi file in quella cartella, puoi includere anche tutte le sottocartelle con ** e invece di includere qualsiasi file (*) puoi essere specifico * .css, * .xy

2

Ecco la mia soluzione, che presuppone un checkout in 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 test:

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

quindi ignora correttamente tutto ciò che non voglio e niente che voglio conservare.

Rilascio del codice

Gitlab è configurato con i mirror del repository per i rami protetti, secondo https://docs.gitlab.com/ee/workflow/repository_mirroring.html

Quando il codice viene inviato a un ramo protetto, verrà rispecchiato nei server di gestione temporanea e di produzione nel /opt/checkout/repo.git/repository nudo. Il seguente post-receivehook (in /opt/checkout/repo.git/hooks/post-receive) eseguirà quindi il checkout del codice nella directory di lavoro.

#!/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}"

Per ulteriori informazioni, consultare https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps


1

Ecco come l'ho fatto:

# 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

Questo è ciò che ha funzionato per me. Ti consente di ignorare tutto tranne file o cartelle specifici

macOS sierra


0

Sono nella stessa barca cercando di gestire un sacco di siti Wordpress in un unico repository. La mia struttura di directory è simile alla seguente:

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

Voglio solo tenere traccia degli elementi all'interno della app/publiccartella per ogni sito. Ho provato i campioni in questa pagina e alcuni dei suggerimenti qui e ho finito per provare questo:

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

che ha funzionato ma avrei dovuto ignorare lo stesso percorso per ogni sito che stavo cercando di evitare.

Quindi ho appena sostituito il nome del sito con *quello che ha fatto il trucco per me. Quindi questo è quello che ho finito per usare:

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

Ciò ha effettivamente ignorato tutto nella cartella del sito mentre catturava tutto nel file app/public cartella per qualsiasi sito che ho creato nella radice.

Nota che non ignorerà i file nella radice, ma solo le directory :)

Spero che questo ti aiuti.


0

Questo è l'unico file che viene ignorato nella maggior parte dei casi, perché hai wp-config-sample.php che puoi condividerlo con altri.

/wp-config.php
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.