Używanie .gitignore do ignorowania wszystkiego oprócz określonych katalogów

140

Moim problemem jest to, że mam kilka witryn WordPress w moim repozytorium git, z których chcę selektywnie zatwierdzać tylko zawartość moich themesfolderów, ignorując pozostałe nadmiarowe pliki znalezione w WordPress.

Wcześniej korzystałem z plików .gitignore, aby ignorować typy plików, ale czy można ich używać na odwrót - to znaczy ignorować wszystko, ALE określoną ścieżkę folderu?

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

Dzięki-

AKTUALIZACJA:

Na podstawie odpowiedzi wykonałem następujące czynności, ale to nie działa. Jakieś pomysły?

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

Wypróbowałem również następujące odmiany:

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

Żaden z nich nie czyta moich themesfolderów.

Yarin
źródło

Odpowiedzi:

133

Oto, jak to zrobiłem - zasadniczo musisz chodzić ścieżkami, nie możesz używać symboli wieloznacznych więcej niż jednego poziomu w dowolnym kierunku:

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

Zwróć uwagę, jak musisz wyraźnie zezwolić na zawartość dla każdego poziomu, który chcesz uwzględnić. Więc jeśli mam podkatalogi 5 głęboko pod tematami, nadal muszę to przeliterować.

U mnie tak to działa. Jeśli komuś zależy na bardziej świadomym wyjaśnieniu za wszelką cenę.

Pomocne są również te odpowiedzi:
jak-zrobić-zanegowane-wzorce-działają-w-gitignore
-jak-zrobić-gitignore-reguły-wykluczenia-faktycznie-działają


UWAGA: Próbowałem użyć podwójnych symboli wieloznacznych `` globów '', ale zgodnie z tym funkcjonalność jest zależna od systemu i nie działa na moim komputerze Mac:

Nie działał:

!**/wp-content/themes/
!**/wp-content/themes/**
Yarin
źródło
4
przed git 1.8.4 działają **tylko symbole wieloznaczne, jeśli nie masz ukośników we wzorcu, zobacz Sparethought.wordpress.com/2011/07/19/...
To powinno działać:!/wordpress/*/wp-content/themes/**/*
that0n3guy
1
Czy ta składnia działa w systemie Windows? Wydaje mi się, że to nie działa ...
ScottF,
Działa cuda w systemie Windows 10. Używając go do wszelkiego rodzaju niestandardowych projektów z Visual Studio Code.
klewis
Użyłem kombinacji tej odpowiedzi i odpowiedzi udzielonej przez @ 吴毅 凡, która mi pomogła.
MikeyE
95

Wypróbowałem powyższe i nie działały tak dobrze. Lepsze podejście jest następujące: 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
źródło
1
@ dwenaus - dzięki za udostępnienie tego - wygląda na przydatne w przypadku repozytoriów zakorzenionych w konkretnym katalogu wordpress, ale nie będzie działać na wielu witrynach wordpress pod nim, co jest tym, o co mi chodziło ..
Yarin
Ta struktura / model jest bardzo pomocna. Chciałem mieć jedno repozytorium dla połączonej instalacji Magento / WP, a przy mniej niż 30 liniach .gitignore przy użyciu tej techniki udało mi się zawęzić to tylko do plików motywu / skórki Magento i plików motywu WP. Dzięki!
random_user_name
po prostu nie używaj tej konfiguracji z automatycznym wdrażaniem, ponieważ początkujący użytkownik git może zepsuć pliki poza obszarami z wcięciami (tj. jeśli przypadkowo usunie wszystkie pliki w repozytorium i zostanie automatycznie wdrożone, będzie bałagan). Poza tym działa dobrze.
dwenaus
Jesteś mężczyzną, stary! Zwłaszcza jeśli twoja wersja to> = 2.1.4. Ref: git-scm.com/docs/gitignore/2.1.4
Haktan Suren,
28

zmodyfikuj pierwszą linię

*

zmień to na

/*
吴毅 凡
źródło
2
Ta praca dla mnie. Mój plik
.gitignore
12

Wypróbuj te odpowiedzi:

Spraw, aby .gitignore ignorowało wszystko oprócz kilku plików

# Ignore everything
*

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

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

Jak powiedzieć Gitowi, aby ignorował wszystko oprócz podkatalogu?

To ignoruje pliki główne i katalogi główne, a następnie cofa ignorowanie głównego katalogu bin:

/*
/*/
!/bin/

W ten sposób otrzymujesz cały katalog bin, w tym podkatalogi i ich pliki.

irytować
źródło
@ irritate - Dzięki, nie widziałem tych - jednak mam problem z zastosowaniem ich w mojej sytuacji. Zobacz moje zmiany powyżej ...
Yarin
1
Drugi link, który zamieściłem, mówi, że potrzebujesz obu !*/wp-content/themes/i !*/wp-content/themes/*. Czy próbowałeś tej odmiany? Alternatywnie, możesz po prostu użyć !*/wp-content/themes/i w każdym katalogu motywów mieć swój własny plik .gitignore z!*
irytować
1
@ irytować - nie, ta odmiana też nie działa, a poza tym nie widzę, jak by się to różniło od!*/wp-content/themes*
Yarin
9

Jeśli poprzedzisz wzorzec wykrzyknikiem ( !), neguje on wszystkie poprzednie wzorce, które go wykluczały. Więc przypuszczalnie możesz zignorować wszystko, a następnie pozwolić tylko na to, co chcesz, używając tego wzorca.

dappawit
źródło
@ dappawit - Dzięki - koncepcja ma sens i działam z plikami, ale nie z moimi folderami z motywami - zobacz moje zmiany powyżej ...
Yarin
Nie jestem ekspertem od wzorców glob, ale czytając stronę .gitignore człowiekiem, wierzę, może to działa: !wordpress/[write out directories]/wp-content/themes/. Zwróć uwagę na zamykający ukośnik i brak zamykającej gwiazdki. Zauważ również, że *będzie pasować tylko do jednego poziomu, a nie do wielu katalogów. Oto strona
podręcznika
Pomogło mi zdać sobie sprawę, że muszę położyć negację po innych zasadach, dzięki
Axe
6

Musiałem zignorować wszystko, ale nie jeden folder z podkatalogami.

U mnie to działa

# Ignore everything
/*

# Not these directories
!folder/

# Not these files
!.gitignore
!.env
!file.txt
Matias Seguel
źródło
5

Powiedzmy, że masz taką strukturę katalogów:

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

Jeśli chcesz zezwolić tylko na witryny / all / files / private / NewSilot i sites / default / files / private / moviesilot , możesz najpierw spróbować tego:

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

To jest źle! Problem z gitignore polega na tym , że musisz najpierw zezwolić na dołączenie katalogu nadrzędnego („prywatnego”) , zanim będziesz mógł zezwolić na dołączenie jego katalogu podrzędnego („gazeta”) do zatwierdzeń.

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
źródło
„musisz najpierw zezwolić na włączenie katalogu nadrzędnego, zanim będziesz mógł zezwolić na jego katalog podrzędny” - Dziękujemy za zwrócenie uwagi! To był właśnie mój problem.
Jet Blue
4

Odpowiedź Yarina zadziałała dla mnie, oto moja wersja (nie potrzebuję /wordpresspodkatalogu):

*

!.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
źródło
4

Zawsze gdzieś w tym utknąłem, nawet po wielokrotnym powrocie do tego pytania. Wymyśliłem szczegółowy proces robienia tego krok po kroku:

Najpierw po prostu użyj git add aby dodać rzeczywistą zawartość.

Wyświetli odpowiednie pliki dodane do indeksu, podczas gdy wszystkie inne nadal nie są śledzone. Pomaga to w konstruowaniu .gitignorekrok po kroku.

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

Dodaj DUMMY.TXTplik tymczasowy do swojego katalogu:

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

Naszym celem jest teraz takie skonstruowanie reguł, aby DUMMY.TXTbyła to jedyna, która po zakończeniu gry nadal byłaby wyświetlana jako Nieśledzona.

Zacznij dodawać reguły:

.gitignore

/*

Pierwsza to ignorowanie wszystkiego. Nieśledzone pliki powinny zniknąć, powinny wyświetlać się tylko pliki zindeksowane:

$ git status

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

Dodaj pierwszy katalog w ścieżce wp-content

/*
!/wp-content

Teraz nieśledzone pliki pojawią się ponownie, ale będą miały tylko wp-contentzawartość

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

Zignoruj ​​wszystko w pierwszym katalogu /wp-content/*i anuluj ignorowanie!/wp-content/themes

/*
!/wp-content

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

Teraz nieśledzone pliki będą dalej zawężane do tylko 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/
        ..

Powtarzaj ten proces, aż ten fikcyjny plik będzie jedynym nadal wyświetlanym jako Nieśledzony:

/*
!/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
źródło
3

Dla szukających środka czyszczącego rozwiązania, wypróbuj następujące rozwiązania.

Jak wspomniano w komentarzach do tego odpowiedzi, musisz używać tej metody rekurencyjnie.

W tym przykładzie masz konfigurację witryny internetowej, w ./której znajduje się .gitfolder i .gitignoreplik, oraz konfigurację instalacji WordPress w ./wordpress. Aby poprawnie zignorować wszystko w ./wordpresskatalogu oprócz samego katalogu motywu ( wordpress/wp-content/themes/my-theme), będziesz musiał rekurencyjnie zignorować i zezwolić każdemu katalogowi aż do katalogu, na który chcesz zezwolić:

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

Powód zignorowania za pomocą symbolu wieloznacznego i zezwolenia (lub zignorowania „poza”) samego katalogu umożliwia Gitowi zajrzenie do katalogu, zanim zignoruje wszystko w nim. Następnie mówimy Gitowi, aby ignorował wszystko poza wskazanym przez nas katalogiem. Oto ta sama składnia, ale w kolejności, w jakiej patrzy na to Git:

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

Miejmy nadzieję, że pomoże to komuś lepiej zrozumieć potrzebę stosowania metody rekurencyjnej.

Oliver Tappin
źródło
3

spóźniony na imprezę, ale oto, czego używam do nieznanej głębokości (przyjęte rozwiązanie wymaga znanej głębokości)

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

w ten sposób wszystko w wp-content nie jest ignorowane.

Jubair
źródło
3

Po wielokrotnej potrzebie tego w końcu znalazłem rozwiązanie [1]:

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

Wyjaśnienie wiersz po wierszu:

  1. Zignoruj ​​wszystkie katalogi w katalogu głównym.
  2. Ignoruj ​​wszystkie pliki z rozszerzeniami w katalogu głównym.
  3. Pozwól .gitignoresobie (i potencjalnie .gitattributes).
  4. Zezwól żądanemu katalogowi ze wszystkimi podkatalogami

[1] Ograniczenia (o których wiem):

  1. Nie ignoruje plików bez rozszerzenia w katalogu głównym (a dodanie /*zepsułoby cały schemat).
  2. Katalog, który chcesz umieścić w linii 4 ( wordpressw tym przypadku) nie może mieć .w nazwie (np. wordpress.1By nie działał). Jeśli ma. , usuń linię 2 i znajdź inny sposób na wykluczenie wszystkich plików w katalogu głównym.
  3. Testowany tylko w systemie Windows z git version 2.17.1.windows.2
Dimagog
źródło
3

Kolejne łatwe rozwiązanie:

Chcesz zignorować wszystkie pliki Wordpress, ale nie motyw (na przykład).

.gitignore , zawartość to:

# 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

W tym przykładzie możesz usunąć wordpress, jeśli .gitignore znajduje się w głównym katalogu wordpress

Możesz zrobić dokładnie to samo z każdym folderem i zawartością, które chcesz „wyjątkowo” trzymać z dala od folderów / plików gitignored

Wniosek:

Pamiętaj, aby anulować ignorowanie wszystkich katalogów ścieżki, którą chcesz zignorować

ALE

Pamiętaj, aby zignorować całą zawartość niezignorowanych katalogów, które chcesz zignorować

Arthur Bouchard
źródło
2

Możesz spróbować tego:

!**/themes/*

Gdzie :

  • !: negate ignore (include)
  • **: dowolne drzewo katalogów (rekurencja), więc nie musisz określać ścieżki folderu
  • motywy: twój folder do uwzględnienia (może być dowolny)
  • *: dowolny plik w tym folderze, możesz również uwzględnić wszystkie podfoldery za pomocą ** i zamiast dołączać dowolny plik (*), możesz podać konkretne * .css, * .xy
Poważny
źródło
2

Oto moje rozwiązanie, które zakłada przejście do 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

i testowanie:

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

więc poprawnie ignoruje wszystko, czego nie chcę i nic, co chcę zatrzymać.

Wydanie kodu

Gitlab jest skonfigurowany z serwerami lustrzanymi repozytorium dla chronionych gałęzi, zgodnie z https://docs.gitlab.com/ee/workflow/repository_mirroring.html

Gdy kod zostanie przesłany do chronionej gałęzi, zostanie dublowany na serwery pomostowe i produkcyjne w samym /opt/checkout/repo.git/repozytorium. Następujący punkt post-receivezaczepienia (in /opt/checkout/repo.git/hooks/post-receive) pobierze kod do katalogu roboczego.

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

Aby uzyskać więcej informacji, zobacz https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps

Waddles
źródło
1

Oto jak to zrobiłem:

# 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

To właśnie zadziałało dla mnie. Pozwala zignorować wszystko oprócz określonych plików lub folderów

macOS sierra

Gaurav Raghuvanshy
źródło
0

Jestem na tej samej łodzi, próbując zarządzać kilkoma witrynami Wordpress w ramach jednego repozytorium. Moja struktura katalogów wygląda następująco:

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

Chcę po prostu śledzić elementy w app/publicfolderze dla każdej witryny. Wypróbowałem próbki na tej stronie, a także niektóre sugestie tutaj, a skończyło się na tym:

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

co działało, ale musiałem zignorować tę samą ścieżkę dla każdej witryny, której starałem się uniknąć.

Potem po prostu zmieniłem nazwę witryny na *i to załatwiło sprawę. Oto, co ostatecznie użyłem:

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

To skutecznie zignorowało wszystko w folderze witryny, jednocześnie przechwytując wszystko w app/publicfolderze dla każdej witryny, którą utworzę w katalogu głównym.

Zauważ, że nie zignoruje plików w katalogu głównym, tylko katalogi :)

Mam nadzieję że to pomoże.

Henz
źródło
0

Jest to jedyny plik, który jest ignorowany w większości przypadków, ponieważ masz plik wp-config-sample.php, który możesz udostępnić innym.

/wp-config.php
Jaskaran Singh
źródło