webentwicklung-frage-antwort-db.com.de

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

Mein Problem ist, dass ich eine Reihe von WordPress-Websites in meinem Git-Repo habe, von denen ich selektiv nur den Inhalt meiner themes-Ordner festlegen möchte, während der Rest der in WordPress gefundenen redundanten Dateien ignoriert wird. 

Ich habe .gitignore-Dateien verwendet, um Dateitypen vorher zu ignorieren, aber kann es auch andersherum verwendet werden, dh alles ignorieren, aber einen bestimmten Ordnerpfad?

wurzel (Git Repo)
-/wordpress
- -/(WordPress Site 1)/wp-content/themes
- -/(WordPress Site 2)/wp-content/themes
- -/(WordPress Site 3)/wp-content/themes

Vielen Dank-

UPDATE: 

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 folgende Variationen ausprobiert:

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

Keiner dieser Dateien liest meine themes-Ordner.

110
Yarin

So habe ich es gemacht - Sie müssen im Wesentlichen die Pfade hinaufgehen, Sie können in keiner Richtung mehr als eine Ebene mit Platzhalterzeichen versehen:

# 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 tief unter Themes Unterverzeichnisse 5 habe, muss ich das immer noch buchstabieren.

So hat es nur bei mir funktioniert. Wenn jemand eine informierte Erklärung mit allen Mitteln anbieten möchte.

Diese Antworten sind auch hilfreich: 
Wie-Negiert-Muster-Arbeit in Gititore
How-Do-Gititore-Ausschlussregeln-eigentlich-Arbeit


HINWEIS: Ich habe versucht, Double-Wildcard-Globs zu verwenden, aber laut this ist diese Funktionalität systemabhängig und funktionierte auf meinem Mac nicht:

Funktioniert nicht:

!**/wp-content/themes/
!**/wp-content/themes/**
101
Yarin

Ich habe das oben ausprobiert und sie funktionierten nicht so gut. Ein viel besserer Ansatz ist wie folgt von hier: 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/
74
dwenaus

Ändern Sie die erste Zeile

*

Ändern Sie es in

/*
15
吴毅凡

Wenn Sie einem Muster ein Ausrufezeichen (!) voranstellen, negiert es alle vorherigen Muster, die es ausgeschlossen haben. Vermutlich könnten Sie also alles ignorieren und mit diesem Muster nur das zulassen, was Sie möchten.

9
dappawit

Versuchen Sie diese Antworten:

.gitignore ignorieren alles außer ein paar Dateien

# Ignore everything
*

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

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

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

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

/*
/*/
!/bin/

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

8
irritate

Yarins Antwort hat für mich funktioniert, hier ist meine Version (Ich brauche kein /wordpress-Unterverzeichnis):

*

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

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

Für mich funktioniert das 

# Ignore everything
/*

# Not these directories
!folder/

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

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

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

so wird alles unter wp-content nicht ignoriert.

3
Jubair

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, versuchen Sie zunächst Folgendes:

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

Das ist falsch! Das Schwierige an gitignore ist, dass Sie zuerst das übergeordnete ("private") Verzeichnis einschließen müssen, bevor Sie zulassen können, dass das untergeordnete Verzeichnis ("newspilot") in Commits eingeschlossen wird.

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

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

3
Peeter Kokk

Wenn Sie nach einer cleaner -Lösung suchen, versuchen Sie Folgendes:.

Wie in den Kommentaren von this answer erwähnt, müssen Sie diese Methode rekursiv verwenden.

In diesem Beispiel haben Sie eine Website-Einrichtung unter ./, in der sich Ihr .git-Ordner und Ihre .gitignore-Datei befinden, und eine WordPress-Installation in ./wordpress. Um alles unter dem ./wordpress-Verzeichnis außer dem Designverzeichnis selbst (wordpress/wp-content/themes/my-theme) vollständig zu ignorieren, müssen Sie jedes Verzeichnis rekursiv ignorieren und zulassen, bis das gewünschte Verzeichnis zulässig ist:

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 das Ignorieren von 'außer') 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
Oliver Tappin

Sie können dies versuchen:

!**/themes/*

Woher :

  • ! : negate ignorieren (include)
  • **: jede Verzeichnisstruktur (Rekursion), damit Sie den Ordnerpfad nicht angeben müssen
  • themes: Ihr Ordner zum Einschließen (kann alles sein)
  • *: Für jede Datei in diesem Ordner können Sie auch alle Unterordner mit ** einschließen. Anstelle von Dateien (*) können Sie auch bestimmte * .css-, * .xy-Dateien angeben
2
Major

Hier ist meine Lösung, die ein Auschecken in wp-content voraussetzt.

# 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 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 Server staging und production im Bare-Repo von /opt/checkout/repo.git/ gespiegelt. Der folgende post-receive Hook (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
Waddles

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 Ihnen, alles außer bestimmten Dateien oder Ordnern zu ignorieren

macOS sierra

1

Ich bleibe immer irgendwo dabei hängen, auch nachdem ich diese Frage mehrmals aufgegriffen habe. Ich habe einen detaillierten Prozess Schritt für Schritt gemacht:

Verwenden Sie zunächst einfach git add, um den tatsächlichen Inhalt hinzuzufügen. 

Es werden die relevanten Dateien angezeigt, die dem Index hinzugefügt wurden, während alle anderen noch nicht verfolgt werden. Dies hilft, .gitignore Schritt für Schritt zu konstruieren.

$ 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.TXT-Datei 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 dieser DUMMY.TXT der einzige ist, der als Ungepflegt erscheint, wenn wir fertig sind.

Beginnen Sie mit dem Hinzufügen der Regeln: 

.gitignore

/*

Zuerst muss man einfach alles ignorieren. Nicht abgerufene Dateien sollten alle verschwunden sein, nur indizierte Dateien sollten angezeigt werden:

$ 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 wp-content hinzu.

/*
!/wp-content

Jetzt werden die nicht gerasterten Dateien wieder angezeigt, haben jedoch nur den Inhalt von 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/
        ..

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

/*
!/wp-content

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

Jetzt werden die nicht gerasterten Dateien weiter auf nur wp-content/themes eingegrenzt.

$ 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 diese Dummy-Datei die einzige ist, die noch 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
1
laggingreflex

Eine andere 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 if .gitignore im Verzeichnis root wordpress entfernen.

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

Fazit :

Achten Sie darauf, alle Verzeichnisse eines Pfades zu löschen, die Sie löschen möchten

ABER

Achten Sie darauf, den gesamten Inhalt nicht ignorierter Verzeichnisse zu ignorieren, die Sie ignorieren möchten

0
Arthur Bouchard

Ich bin im selben Boot und versuche, ein paar Wordpress-Sites unter einem Repo zu verwalten. Meine Verzeichnisstruktur sieht so 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/public-Ordner für jede Site verfolgen. Ich habe die Beispiele auf dieser Seite sowie einige der Vorschläge hier ausprobiert und am Ende versucht: 

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

was funktionierte, aber ich musste den gleichen Pfad für jede Site ignorieren, die ich zu vermeiden versuchte. 

Dann habe ich einfach den Namen der Site durch * ersetzt und das hat den Trick für mich gemacht. Also habe ich am Ende verwendet:

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

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

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

Hoffe das hilft.

0
Henry

Nach mehrmaligem Bedarf habe ich endlich eine Lösung gefunden [1]:

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

Erklärung Zeile für Zeile:

  1. Ignoriere alle Verzeichnisse im Stammverzeichnis.
  2. Ignoriere alle Dateien mit Erweiterungen im Stammverzeichnis.
  3. Erlaube .gitignore selbst (und möglicherweise .gitattributes).
  4. Erlaube das gewünschte Verzeichnis mit allen Unterverzeichnissen

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

  1. Es ignoriert keine Dateien ohne eine Erweiterung im Stammverzeichnis (und das Hinzufügen von /* würde das gesamte Schema zerstören).
  2. Das Verzeichnis, das Sie in Zeile 4 einschließen möchten (in diesem Fall wordpress), darf . nicht im Namen enthalten (z. B. wordpress.1 würde nicht funktionieren). Wenn es über einen . verfügt, entfernen Sie Zeile 2 und suchen Sie nach einem anderen Weg, um alle Dateien im Stammverzeichnis auszuschließen.
  3. Nur unter Windows mit git version 2.17.1.windows.2 getestet
0
Dimagog