Verwenden von .gitignore, um alles außer bestimmten Verzeichnissen zu ignorieren


140

Mein Problem ist, dass ich eine Reihe von WordPress-Websites in meinem Git-Repo habe, von denen ich selektiv nur den Inhalt meiner themesOrdner festschreiben möchte , während ich den Rest der redundanten Dateien in WordPress ignoriere.

Ich habe zuvor .gitignore-Dateien verwendet, um Dateitypen zu ignorieren, aber kann es auch umgekehrt verwendet werden - das heißt, alles zu ignorieren, ABER einen bestimmten Ordnerpfad?

root (git repo)
- / wordpress
- - / (WordPress Site 1) / wp-Inhalt / Themen
- - / (WordPress Site 2) / wp-Inhalt / Themen
- - / (WordPress Site 3) / wp-Inhalt / Themen

Vielen Dank-

AKTUALISIEREN:

Basierend auf den Antworten habe ich Folgendes getan, aber es funktioniert nicht. Irgendwelche Ideen?

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

Ich habe auch die folgenden Variationen ausprobiert:

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

Keiner von diesen las meine themesOrdner.

Antworten:


133

Hier ist, wie ich es gemacht habe - Sie müssen im Wesentlichen die Pfade hinaufgehen, Sie können nicht mehr als eine Ebene in eine Richtung als Wildcard verwenden:

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

Beachten Sie, wie Sie Inhalte für jede Ebene, die Sie einschließen möchten, explizit zulassen müssen. Wenn ich also Unterverzeichnisse 5 tief unter Themen habe, muss ich das noch formulieren.

Nur so hat es bei mir funktioniert. Wenn jemand auf jeden Fall eine fundiertere Erklärung anbieten möchte.

Auch diese Antworten sind hilfreich:
Wie-negiert-Muster-arbeiten-in-Gitignore?
Wie-funktioniert-Gitignore-Ausschlussregeln-funktionieren tatsächlich


HINWEIS: Ich habe versucht, Doppel-Platzhalter-Globs zu verwenden, aber dementsprechend ist diese Funktionalität systemabhängig und hat auf meinem Mac nicht funktioniert:

Funktioniert nicht:

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

4
vor git 1.8.4 funktioniert der **Platzhalter nur, wenn Sie keine Schrägstriche in Ihrem Muster haben, siehe sparethought.wordpress.com/2011/07/19/…

Dies sollte funktionieren:!/wordpress/*/wp-content/themes/**/*
that0n3guy

1
Funktioniert diese Syntax unter Windows? Es scheint nicht für mich zu funktionieren ...
ScottF

Unter Windows 10 wirkt es Wunder. Verwenden Sie es für alle Arten von benutzerdefinierten Projekten aus Visual Studio Code.
Klewis

Ich habe eine Kombination aus dieser und der von @ 吴毅 凡 bereitgestellten Antwort verwendet, die für mich funktioniert hat.
MikeyE

95

Ich habe das oben versucht und sie haben nicht so gut funktioniert. Ein besserer Ansatz ist von hier aus wie folgt: 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- danke, dass du dies geteilt hast- sieht nützlich aus für Repos, die in einem bestimmten WordPress-Verzeichnis verwurzelt sind, funktioniert aber nicht bei der Wiedergabe mehrerer WordPress-Sites darunter, was ich wollte.
Yarin

Diese Struktur / Modell ist super hilfreich. Ich wollte ein einzelnes Repo für eine kombinierte Magento / WP-Installation, und mit weniger als 30 Zeilen Gitignore mit dieser Technik konnte ich es auf die Magento-Theme / Skin-Dateien und die WP-Themendateien eingrenzen. Vielen Dank!
random_user_name

Verwenden Sie dieses Setup nur nicht bei der automatischen Bereitstellung, da ein unerfahrener Git-Benutzer Dateien außerhalb der eingerückten Bereiche durcheinander bringen kann (dh wenn er versehentlich alle Dateien im Repo löscht und diese automatisch bereitgestellt werden, ist dies unübersichtlich). Ansonsten funktioniert es gut.
dwenaus

Du bist der Mann, Alter! Besonders wenn Ihre Version> = 2.1.4 ist. Ref: git-scm.com/docs/gitignore/2.1.4
Haktan Suren

28

Ändern Sie die erste Zeile

*

ändere es auf

/*

2
Diese Arbeit für mich. Meine .gitignore-Datei ist wie folgt / *! .Gitignore! / Vendors
umbalaconmeogia

12

Versuchen Sie diese Antworten:

Lassen Sie .gitignore alles außer ein paar Dateien ignorieren

# Ignore everything
*

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

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

Wie kann ich Git anweisen, alles außer einem Unterverzeichnis zu ignorieren?

Dies ignoriert Root-Dateien und Root-Verzeichnisse und hebt dann das Root-Bin-Verzeichnis auf:

/*
/*/
!/bin/

Auf diese Weise erhalten Sie das gesamte bin-Verzeichnis, einschließlich der Unterverzeichnisse und ihrer Dateien.


@ irritate- Danke, habe diese nicht gesehen - aber ich habe Probleme, sie auf meine Situation anzuwenden. Siehe meine Änderungen oben ...
Yarin

1
Der zweite Link, den ich gepostet habe, besagt, dass Sie beide !*/wp-content/themes/und benötigen würden !*/wp-content/themes/*. Haben Sie diese Variante ausprobiert? Alternativ können Sie auch einfach verwenden !*/wp-content/themes/und in jedem Themenverzeichnis eine eigene .gitignore-Datei mit!*
irritieren

1
@ irritate- nein, diese Variation funktioniert auch nicht, und trotzdem sehe ich nicht, wie sich das von!*/wp-content/themes*
Yarin

9

Wenn Sie einem Muster ein Ausrufezeichen ( !) voranstellen, wird jedes vorherige Muster negiert, das es ausgeschlossen hat. Vermutlich könnten Sie also alles ignorieren und dann nur zulassen, was Sie wollen, indem Sie dieses Muster verwenden.


@ dappawit- Danke- Konzept macht Sinn, und ich habe es für Dateien funktionieren lassen, aber nicht für meine Themenordner- siehe meine Änderungen oben ...
Yarin

Ich bin kein Experte für Glob-Muster, aber beim Lesen der .gitignore-Manpage glaube ich, dass dies funktionieren kann : !wordpress/[write out directories]/wp-content/themes/. Beachten Sie den schließenden Schrägstrich und kein schließendes Sternchen. Beachten Sie auch, dass dies *nur einer Ebene entspricht, nicht mehreren Verzeichnissen. Hier ist die Manpage: kernel.org/pub/software/scm/git/docs/gitignore.html
dappawit

Hat mir geholfen zu erkennen, dass ich die Negation nach den anderen Regeln setzen musste, danke
Axe

6

Ich musste alles außer einem Ordner mit Unterverzeichnissen ignorieren.

Bei mir funktioniert das

# Ignore everything
/*

# Not these directories
!folder/

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

5

Angenommen, Sie haben eine Verzeichnisstruktur wie diese:

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

Wenn Sie nur Sites / all / files / private / Newspilot und Sites / default / files / Private / Newspilot zulassen möchten , können Sie zunächst Folgendes versuchen:

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

Das ist falsch! Das Knifflige an gitignore ist, dass Sie zuerst zulassen müssen, dass das übergeordnete ("private") Verzeichnis aufgenommen wird , bevor Sie das untergeordnete Verzeichnis ("Newspilot") in Commits aufnehmen können.

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

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


"Sie müssen zuerst zulassen, dass das übergeordnete Verzeichnis aufgenommen wird, bevor Sie das untergeordnete Verzeichnis zulassen können" - Vielen Dank, dass Sie darauf hingewiesen haben! War genau mein Problem.
Jet Blue

4

Yarins Antwort hat bei mir funktioniert, hier ist meine Version (ich brauche das /wordpressUnterverzeichnis nicht ):

*

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

Ich stecke immer irgendwo fest, auch wenn ich mehrmals auf diese Frage zurückgekommen bin. Ich habe mir einen detaillierten Prozess ausgedacht, der Schritt für Schritt durchgeführt wird:

Zuerst einfach benutzen git add , um den eigentlichen Inhalt hinzuzufügen.

Es werden die relevanten Dateien angezeigt, die dem Index hinzugefügt wurden, während alle anderen noch nicht verfolgt wurden. Dies hilft .gitignorebeim schrittweisen Aufbau .

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

Fügen Sie eine temporäre DUMMY.TXTDatei in Ihr Verzeichnis ein:

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

Unser Ziel ist es nun, die Regeln so zu konstruieren, dass dies DUMMY.TXTdie einzige ist, die noch als nicht verfolgt angezeigt wird, wenn wir fertig sind.

Fügen Sie die Regeln hinzu:

.gitignore

/*

Zuerst muss man einfach alles ignorieren. Nicht verfolgte Dateien sollten alle verschwunden sein, nur indizierte Dateien sollten Folgendes anzeigen:

$ git status

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

Fügen Sie das erste Verzeichnis im Pfad hinzu wp-content

/*
!/wp-content

Jetzt werden die nicht verfolgten Dateien wieder angezeigt, haben aber nur wp-contentden Inhalt

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

Ignoriere alles im ersten Verzeichnis /wp-content/*und ignoriere es!/wp-content/themes

/*
!/wp-content

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

Jetzt werden die nicht verfolgten Dateien weiter auf nur noch eingegrenzt 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/
        ..

Wiederholen Sie den Vorgang, bis nur noch diese Dummy-Datei als nicht verfolgt angezeigt wird:

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

Wenn Sie nach einer saubereren Lösung suchen , versuchen Sie bitte Folgendes.

Wie in den Kommentaren dieser Antwort erwähnt, müssen Sie diese Methode rekursiv verwenden.

In diesem Beispiel haben Sie ein Website-Setup, in ./dem sich Ihr .gitOrdner und Ihre .gitignoreDatei befinden, und ein WordPress-Installationssetup in ./wordpress. Um alles unter dem ./wordpressVerzeichnis außer dem Themenverzeichnis selbst ( wordpress/wp-content/themes/my-theme) korrekt zu ignorieren , müssen Sie jedes Verzeichnis rekursiv ignorieren und zulassen, bis das Verzeichnis, das Sie zulassen möchten:

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

Der Grund für das Ignorieren mit einem Platzhalter und das Zulassen (oder Ignorieren von 'abgesehen von') des Verzeichnisses selbst ermöglicht es Git, zuerst in das Verzeichnis zu schauen, bevor alles darin ignoriert wird. Wir weisen Git dann an, alles außer dem von uns angegebenen Verzeichnis zu ignorieren. Hier ist die gleiche Syntax, aber in der Reihenfolge, wie Git sie betrachtet:

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

Hoffentlich hilft dies jemandem, die Notwendigkeit der rekursiven Methode besser zu verstehen.


3

spät zur Party, aber hier ist, was ich für unbekannte Tiefe benutze (die akzeptierte Lösung erfordert bekannte Tiefe)

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

auf diese weise wird alles unter wp-content nicht ignoriert.


3

Nachdem ich dies mehrmals gebraucht habe, habe ich endlich eine Lösung gefunden [1]:

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

Erklärung Zeile für Zeile:

  1. Ignorieren Sie alle Verzeichnisse im Stammverzeichnis.
  2. Ignorieren Sie alle Dateien mit Erweiterungen im Stammverzeichnis.
  3. Erlaube .gitignoredich (und möglicherweise .gitattributes).
  4. Lassen Sie das gewünschte Verzeichnis mit allen Unterverzeichnissen zu

[1] Einschränkungen (die mir bekannt sind):

  1. Dateien ohne Erweiterung im Stammverzeichnis werden nicht ignoriert (und das Hinzufügen /*würde das gesamte Schema beschädigen).
  2. Das Verzeichnis, das Sie ( wordpressin diesem Fall) in Zeile 4 aufnehmen möchten, darf nicht .im Namen enthalten sein (z. B. wordpress.1würde nicht funktionieren). Wenn dies der Fall ist ., entfernen Sie Zeile 2 und suchen Sie nach einer anderen Möglichkeit, alle Dateien im Stammverzeichnis auszuschließen.
  3. Getestet nur unter Windows mit git version 2.17.1.windows.2

3

Eine weitere einfache Lösung:

Sie möchten alle Wordpress-Dateien ignorieren, aber nicht Ihr Thema (zum Beispiel).

.gitignore , Inhalt ist:

# 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 diesem Beispiel können Sie WordPress entfernen, wenn sich .gitignore im Root-WordPress-Verzeichnis befindet

Sie können genau das Gleiche mit allen Ordnern und Inhalten tun, die Sie "ausnahmsweise" aus gitignored Ordnern / Dateien heraushalten möchten

Fazit :

Stellen Sie sicher, dass Sie alle Verzeichnisse eines Pfads aufheben, den Sie aufheben möchten

ABER

Ignorieren Sie unbedingt den gesamten Inhalt nicht signierter Verzeichnisse, die Sie ignorieren möchten


2

Sie können dies versuchen:

!**/themes/*

Wo :

  • ! : negieren ignorieren (einschließen)
  • **: Beliebiger Verzeichnisbaum (Rekursion), sodass Sie Ihren Ordnerpfad nicht angeben müssen
  • Themen: Ihr Ordner enthalten (kann alles sein)
  • *: Für jede Datei in diesem Ordner können Sie auch alle Unterordner mit ** einschließen. Statt einer beliebigen Datei (*) können Sie * .css, * .xy angeben

2

Hier ist meine Lösung, die einen Checkout in voraussetzt 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

und Testen:

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

es ignoriert also korrekt alles, was ich nicht will und nichts, was ich behalten möchte.

Code freigeben

Gitlab ist gemäß https://docs.gitlab.com/ee/workflow/repository_mirroring.html mit Repository-Spiegeln für geschützte Zweige konfiguriert

Wenn Code in einen geschützten Zweig verschoben wird, wird er auf die Staging- und Produktionsserver im /opt/checkout/repo.git/Bare-Repo gespiegelt . Der folgende post-receiveHook (in /opt/checkout/repo.git/hooks/post-receive) checkt dann den Code in das Arbeitsverzeichnis aus.

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

Weitere Informationen finden Sie unter https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps


1

So habe ich es gemacht:

# 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

Das hat bei mir funktioniert. Ermöglicht es Ihnen, alles außer bestimmten Dateien oder Ordnern zu ignorieren

macOS sierra


0

Ich bin im selben Boot und versuche, eine Reihe von Wordpress-Sites unter einem Repo zu verwalten. Meine Verzeichnisstruktur sieht folgendermaßen aus:

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

Ich möchte nur die Elemente im app/publicOrdner für jede Site verfolgen . Ich habe die Beispiele auf dieser Seite sowie einige der Vorschläge hier ausprobiert und am Ende Folgendes ausprobiert:

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

Das funktionierte, aber ich musste für jede Site, die ich vermeiden wollte, denselben Pfad ignorieren.

Dann habe ich einfach den Namen der Site durch ersetzt *und das hat den Trick für mich getan. Das habe ich also benutzt:

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

Dadurch wurde effektiv alles im Ordner der Site ignoriert, während alles im app/publicOrdner für jede Site erfasst wurde , die ich im Stammverzeichnis erstellt habe.

Beachten Sie, dass Dateien im Stammverzeichnis nicht ignoriert werden, sondern nur Verzeichnisse :)

Hoffe das hilft.


0

Dies ist die einzige Datei, die in den meisten Fällen ignoriert wird, da Sie die Datei wp-config-sample.php haben, die Sie für andere freigeben können.

/wp-config.php
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.