Використання .gitignore для ігнорування всього, крім конкретних каталогів


140

Моє питання полягає в тому, що в моєму git repo є маса веб-сайтів WordPress, з яких я хочу вибірково вводити лише вміст своїх themesпапок, ігноруючи решту зайвих файлів, знайдених у WordPress.

Раніше я використовував файли .gitignore, щоб ігнорувати типи файлів, але чи можна їх використовувати навпаки - тобто ігнорувати все, АЛЕ певний шлях до папки?

root (git repo)
- / wordpress
- - / (WordPress Site 1) / wp-content / теми
- - / (WordPress Site 2) / wp-content / теми
- - / (WordPress Site 3) / wp-content / теми

Дякую-

ОНОВЛЕННЯ:

На основі відповідей я зробив наступне, але це не працює. Будь-які ідеї?

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

Я також спробував такі варіанти:

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

Жоден із них не читав мої themesпапки.

Відповіді:


133

Ось як я це зробив - ви, по суті, повинні піти по стежках, ви не можете підкреслити більше одного рівня в будь-якому напрямку:

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

Зауважте, як вам явно потрібно дозволити вміст для кожного рівня, який ви хочете включити. Отже, якщо у мене є підкаталоги 5 глибоких тем, мені все одно потрібно це прописати.

Це лише те, як воно працювало на мене. Якщо хтось небайдужий, будь-якими способами запропонуйте більш усвідомлене пояснення.

Крім того, ці відповіді корисні:
як робити-заперечувати шаблони-працювати-в-гітигнорувати,
як робити -гітигнорувати-виключення-правила-фактично працювати


ПРИМІТКА. Я спробував використовувати "глобуси" з подвійним символом, але відповідно до цього функціональність залежить від системи, і вона не працює на моєму комп'ютері:

Не працює:

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

4
перед git 1.8.4 **підстановка працює лише, якщо у вас немає косої риски, див. rezerthought.wordpress.com/2011/07/19/…

Це має спрацювати:!/wordpress/*/wp-content/themes/**/*
that0n3guy

1
Чи працює цей синтаксис у Windows? Здається, це не працює для мене ...
ScottF

Він творить чудеса в Windows 10. Використовуючи його для всіх видів користувацьких проектів від Visual Studio Code.
klewis

Я використав комбінацію цієї відповіді та тієї, яку надав @ 吴毅 凡, яка працювала на мене.
MikeyE

95

Я спробував вище, і вони не так добре спрацювали. Звідси кращий підхід: 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- спасибі за те, що поділився цим - виглядає корисним для репостів, корінних у конкретному редакторі wordpress, але він не працюватиме на репортажах декількох сайтів wordpress під ним, для чого я йшов ..
Yarin

Ця структура / модель дуже корисна. Я хотів одного репо для комбінованої установки Magento / WP, і, маючи менше 30 рядків .gitignore за допомогою цієї методики, я зміг змусити її звузитись лише до файлів теми / шкірних файлів Magento та файлів тем WP. Дякую!
random_user_name

просто не використовуйте цю установку з автоматичним розгортанням, оскільки початківець користувач git може зіпсувати файли за межами відрізаних областей (тобто, якщо вони видалять усі файли в репо, випадково, і якщо це автоматично розгорнуто, це буде безладним). Крім того, це добре працює.
dwenaus

Ти чоловік чувак! Особливо, якщо ваша версія> = 2.1.4. Ref: git-scm.com/docs/gitignore/2.1.4
Haktan Suren

28

змінити перший рядок

*

змінити його на

/*

2
Ця робота для мене. Мій файл .gitignore такий / *! .Gitignore! / Vendors
umbalaconmeogia

12

Спробуйте відповісти:

Зробіть .gitignore ігнорувати все, крім кількох файлів

# Ignore everything
*

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

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

Як мені сказати Git ігнорувати все, крім підкаталогу?

Це ігнорує кореневі файли та кореневі каталоги, а потім ігнорує каталог кореневих бін:

/*
/*/
!/bin/

Таким чином ви отримуєте весь каталог бін, включаючи підкаталоги та їх файли.


@ irritate- Спасибі, не бачила цього- однак, у мене виникають проблеми із застосуванням їх до моєї ситуації. Дивіться мої зміни вище ...
Ярін

1
Друга посилання, яку я розмістила, говорить про те, що вам знадобиться і те, !*/wp-content/themes/і !*/wp-content/themes/*. Ви спробували цю варіацію? Також в якості альтернативи ви можете просто використовувати, !*/wp-content/themes/і в кожному каталозі тем є свій власний файл .gitignore з!*
дратувати

1
@ дратуй - ні, що варіація теж не працює, і все одно я не бачу, чим це буде відрізнятися від!*/wp-content/themes*
Ярін

9

Якщо ви будете префіксувати візерунок зі знаком оклику ( !), він заперечує будь-який попередній шаблон, який його виключав. Тож, мабуть, ви могли проігнорувати все, тоді дозволити лише те, що хочете, використовуючи цей шаблон.


@ dappawit- Дякую - концепція має сенс, і я отримав це для роботи з файлами, але не для папок моїх тем. Дивіться мої редагування вище ...
Ярина

Я не експерт по формам Глоби, але читання .gitignore людей сторінки, я вважаю , що це може працювати: !wordpress/[write out directories]/wp-content/themes/. Помітьте косою рисою закриття та не майте зірочки. Також зауважте, що *відповідатиме лише один рівень, а не декілька каталогів. Ось
головна

Допоміг мені зрозуміти, що мені потрібно було поставити заперечення за іншими правилами завдяки
Ax

6

Мені потрібно було ігнорувати все, але не одну папку з підкаталогами.

Для мене це працює

# Ignore everything
/*

# Not these directories
!folder/

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

5

Скажімо, у вас така структура каталогу:

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

Якщо ви хочете дозволити лише сайти / всі / файли / приватні / газетний пілот та сайти / за замовчуванням / файли / приватні / новини , ви можете спершу спробувати це:

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

Це неправильно! Найскладніша річ із gitignore полягає в тому , що спочатку потрібно дозволити включити батьківський ("приватний") каталог , перш ніж ви зможете дозволити його дочірній каталог ("newspilot") включити до комітетів.

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

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


"Ви повинні спершу дозволити включити батьківський каталог, перш ніж Ви зможете дозволити його дочірній каталог" - Дякую, що вказали на це! Якраз була моєю проблемою.
Jet Blue

4

Відповідь Яріна працювала на мене, ось моя версія (мені не потрібен /wordpressпідкаталог):

*

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

Я завжди десь зациклююся на цьому навіть після того, як неодноразово повертаюся до цього питання. Я придумав детальний процес робити це поетапно:

Спочатку просто використовуйте git addдля додавання фактичного вмісту.

На ньому будуть показані відповідні файли, додані до індексу, а всі інші ще не збережені. Це допомагає виконувати .gitignoreкрок за кроком.

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

Додайте тимчасовий DUMMY.TXTфайл у свій каталог:

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

Наша мета зараз - побудувати правила таким чином, щоб це DUMMY.TXTбуло єдиним, що все ще відображається як Неназваний, коли ми закінчимо.

Почніть додавати правила:

.gitignore

/*

По-перше, це просто ігнорувати все. Файли, що не відслідковуються, мають бути зникли, лише індексовані файли мають відображатись:

$ git status

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

Додайте перший шлях у шлях wp-content

/*
!/wp-content

Тепер файли Untracked знову з’являться, але мають лише 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/
        ..

Ігноруйте все в першому режимі /wp-content/*і не ігноруйте!/wp-content/themes

/*
!/wp-content

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

Тепер файли Untracked ще більше звузяться до лише 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/
        ..

Повторіть процес, поки цей фіктивний файл єдиний, який все ще відображається як Немає:

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

Для тих, хто шукає більш чисте рішення, будь ласка, спробуйте наступне.

Як згадується в коментарях до цього відповіді, ви повинні використовувати цей метод рекурсивно.

У цьому прикладі у вас є налаштування веб-сайту, у ./якому розміщена ваша .gitпапка та .gitignoreфайл, та встановлення установки WordPress ./wordpress. Щоб правильно ігнорувати все, що знаходиться в ./wordpressкаталозі, крім самого тематичного каталогу ( wordpress/wp-content/themes/my-theme), вам доведеться рекурсивно ігнорувати та дозволити кожен каталог до тих каталогу, до яких ви хочете дозволити:

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

Причина ігнорування за допомогою підстановки та дозволяє (або ігнорувати «крім») сам каталог дозволяє Git заглядати всередину каталогу, перш ніж ігнорувати все, що знаходиться всередині. Потім ми кажемо Git ігнорувати все, крім «каталогу», який ми вказали. Ось такий же синтаксис, але для того, як 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

Сподіваємось, це допоможе комусь краще зрозуміти необхідність рекурсивного методу.


3

пізно на вечірку, але ось що я використовую для невідомої глибини (прийняте рішення вимагає відомої глибини)

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

таким чином, все під wp-контентом не ігнорується.


3

Маючи потребу в цьому кілька разів, я нарешті знайшов рішення [1]:

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

Пояснення за рядком:

  1. Ігноруйте всі каталоги в корені.
  2. Ігноруйте всі файли з розширеннями в корені.
  3. Дозволити .gitignoreсобі (і потенційно .gitattributes).
  4. Дозволити потрібний каталог з усіма підкаталогами

[1] Обмеження (про які я знаю):

  1. Він не ігнорує файли без розширення в корені (а додавання /*порушить всю схему).
  2. Каталог, який ви хочете включити у рядок 4 ( wordpressу цьому випадку), не може містити .ім'я (наприклад wordpress.1, не працює). Якщо у нього є a ., видаліть рядок 2 і знайдіть інший спосіб виключення всіх файлів у корені.
  3. Тестується лише в Windows з git version 2.17.1.windows.2

3

Ще одне просте рішення:

Ви хочете ігнорувати всі файли Wordpress, але не свою тему (наприклад).

.gitignore , вміст:

# 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

У цьому прикладі ви можете видалити wordpress, якщо .gitignore знаходиться в кореневому каталозі wordpress

Ви можете зробити те саме з усіма папками та вмістом, які ви хочете "виключно" не захищати від папок / файлів

Висновок:

Обов’язково зніміть усі каталоги шляху, який ви хочете відігнорувати

АЛЕ

Не забудьте проігнорувати весь вміст невідомих каталогів, які ви хочете ігнорувати


2

Ви можете спробувати це:

!**/themes/*

Де :

  • !: ігнорувати ігнорувати (включати)
  • **: будь-яке дерево каталогів (рекурсія), тому вам не потрібно вказувати шлях до папки
  • теми: ваша папка, яку потрібно включити (може бути будь-що)
  • *: будь-який файл у цій папці, ви можете включати всі підпапки також із **, а замість будь-якого файлу (*) ви можете бути конкретним * .css, * .xy

2

Ось моє рішення, яке передбачає оформлення замовлення 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

і тестування:

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

тому він правильно ігнорує все, чого я не хочу, і нічого, що я хочу зберегти.

Код випуску

Gitlab налаштований з дзеркалами сховища для захищених гілок, відповідно до https://docs.gitlab.com/ee/workflow/repository_mirroring.html

Коли код буде натиснений на захищену гілку, він буде відображатися на серверах постановки та виробництва в /opt/checkout/repo.git/голому репо. Наступний post-receiveгак (в /opt/checkout/repo.git/hooks/post-receive) потім зарахує код у робочий каталог.

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

Для отримання додаткової інформації дивіться https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps


1

Ось як я це зробив:

# 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

Це те, що працювало для мене. Дозволяє ігнорувати все, крім певних файлів чи папок

macOS sierra


0

Я в одному човні намагаюся керувати купою Wordpress сайтів під одним репо. Структура мого каталогу виглядає приблизно так:

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

Я хочу просто відстежувати елементи всередині app/publicпапки для кожного сайту. Я спробував зразки на цій сторінці , а також деякі пропозиції тут і, нарешті, спробував це:

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

який працював, але мені доведеться ігнорувати один і той же шлях для кожного сайту, якого я намагався уникати.

Тоді я просто замінив назву сайту на, *і це зробило для мене трюк. Отже, це я закінчив:

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

Це фактично ігнорувало все в папці сайту, захоплюючи все в app/publicпапці для будь-якого сайту, який я створюю в корені.

Зауважте, що він не буде ігнорувати файли в корені, а лише каталоги :)

Сподіваюся, це допомагає.


0

Це єдиний файл, який в більшості випадків ігнорується, оскільки у вас є wp-config-sample.php, яким ви можете поділитися ним з іншими.

/wp-config.php
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.