Использование .gitignore для игнорирования всего, кроме определенных каталогов

149

Моя проблема в том, что в моем репозитории git есть несколько веб-сайтов WordPress, из которых я хочу выборочно фиксировать только содержимое моих themesпапок, игнорируя при этом остальные избыточные файлы, обнаруженные в WordPress.

Раньше я использовал файлы .gitignore, чтобы игнорировать типы файлов, но можно ли его использовать наоборот - то есть игнорировать все, НО определенный путь к папке?

root (git repo)
- / wordpress
- - / (Сайт WordPress 1) / wp-content / themes
- - / (Сайт WordPress 2) / wp-content / themes
- - / (Сайт WordPress 3) / wp-content / themes

Благодарность-

ОБНОВИТЬ:

Основываясь на ответах, я сделал следующее, но это не работает. Любые идеи?

# 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папки.

Ярин
источник

Ответы:

137

Вот как я это сделал - вам, по сути, нужно идти вверх по дорожкам, вы не можете использовать подстановочные знаки более чем на один уровень в любом направлении:

# 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 глубоко под темами, мне все равно нужно это разъяснить.

Только так это сработало для меня. Если кто-то захочет предложить более информированное объяснение во что бы то ни стало.

Кроме того, полезны эти ответы:
как-сделать-отрицательные-шаблоны-работа-в-gitignore
как-сделать-gitignore-исключение-правила-на самом деле-работа


ПРИМЕЧАНИЕ. Я пробовал использовать «globs» с двойным подстановочным знаком, но в соответствии с этим эта функциональность зависит от системы и не работает на моем Mac:

Не работает:

!**/wp-content/themes/
!**/wp-content/themes/**
Ярин
источник
4
до git 1.8.4 **подстановочный знак работает только в том случае, если в вашем шаблоне нет косой черты, см. Spareknight.wordpress.com/2011/07/19/…
Это должно сработать:!/wordpress/*/wp-content/themes/**/*
that0n3guy
1
Этот синтаксис работает в Windows? Мне кажется, это не работает ...
ScottF
Он творит чудеса в Windows 10. Использование его для всех видов пользовательских проектов из Visual Studio Code.
клейви
Я использовал комбинацию этого ответа и ответа, предоставленного @ 吴毅 凡, который сработал для меня.
MikeyE
99

Я попробовал описанное выше, но они не сработали. Отсюда следует лучший подход: 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 под ним, что я и собирался сделать ..
Ярин
Эта структура / модель очень полезна. Мне нужен был единый репозиторий для комбинированной установки Magento / WP, и с менее чем 30 строками .gitignore, использующими эту технику, я смог сузить его до файлов темы / скина Magento и файлов темы WP. Благодарность!
random_user_name
просто не используйте эту настройку с автоматическим развертыванием, потому что начинающий пользователь git может испортить файлы за пределами областей с отступом (например, если они случайно удалят все файлы в репозитории, и это будет развернуто автоматически, это будет беспорядочно). В остальном он работает хорошо.
dwenaus
Ты мужик, чувак! Особенно, если ваша версия> = 2.1.4. Ссылка: git-scm.com/docs/gitignore/2.1.4
Haktan Suren 01
32

изменить первую строку

*

измените это на

/*
吴毅 凡
источник
2
Эта работа для меня. Мой файл .gitignore выглядит так / *! .Gitignore! /
Vendors
13

Попробуйте эти ответы:

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

# Ignore everything
*

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

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

Как мне сказать Git игнорировать все, кроме подкаталога?

Это игнорирует корневые файлы и корневые каталоги, а затем не игнорирует корневой каталог bin:

/*
/*/
!/bin/

Таким образом, вы получите весь каталог bin, включая подкаталоги и их файлы.

раздражать
источник
@ раздражает - Спасибо, не видел - однако у меня проблемы с их применением в моей ситуации. Смотрите мои правки выше ...
Ярин
1
Вторая ссылка, которую я опубликовал, говорит, что вам понадобятся оба !*/wp-content/themes/и !*/wp-content/themes/*. Вы пробовали этот вариант? Кроме того, в качестве альтернативы вы можете просто использовать !*/wp-content/themes/и в каждой папке тем иметь свой собственный файл .gitignore с!*
раздражать
1
@ раздражает - нет, этот вариант тоже не работает, и в любом случае я не понимаю, чем он будет отличаться от!*/wp-content/themes*
Ярин
9

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

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

Допустим, у вас есть такая структура каталогов:

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

Если вы хотите разрешить только сайты / все / файлы / частные / газеты и сайты / default / файлы / частные / газеты , вы можете сначала попробовать следующее:

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

Это не правильно! Сложность с gitignore заключается в том, что вы должны сначала разрешить включение родительского («частного») каталога , прежде чем вы сможете разрешить включение его дочернего каталога («газетилот») в коммиты.

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

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

Пеэтер Кокк
источник
1
«вы должны сначала разрешить включение родительского каталога, прежде чем вы сможете разрешить его дочерний каталог» - Спасибо, что указали на это! Была именно моя проблема.
Jet Blue
6

Мне нужно было игнорировать все, кроме одной папки с подкаталогами.

Для меня это работает

# Ignore everything
/*

# Not these directories
!folder/

# Not these files
!.gitignore
!.env
!file.txt
Матиас Сегель
источник
5

Я всегда где-то зацикливаюсь на этом, даже если возвращаюсь к этому вопросу много раз. Я придумал подробный процесс, как это сделать шаг за шагом:

Сначала просто используйте 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

Теперь файлы без отслеживания снова появятся, но будут содержать только их 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

Теперь файлы без отслеживания будут сужены до 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
отстающий рефлекс
источник
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
cabgfx
источник
4

После того, как мне это понадобилось несколько раз, я наконец нашел решение [1]:

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

Объяснение построчно:

  1. Игнорировать все каталоги в корне.
  2. Игнорируйте все файлы с расширениями в корне.
  3. Позвольте .gitignoreсебе (и потенциально .gitattributes).
  4. Разрешить желаемый каталог со всеми подкаталогами

[1] Ограничения (о которых я знаю):

  1. Он не игнорирует файлы без расширения в корне (и добавление /*нарушит всю схему).
  2. Каталог, который вы хотите включить в строку 4 ( wordpressв этом случае), не может иметь .в имени (например wordpress.1, не будет работать). Если он есть ., удалите строку 2 и найдите другой способ исключить все файлы в корне.
  3. Проверено только на Windows с git version 2.17.1.windows.2
Димагог
источник
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-content, не игнорируется.

Джубайр
источник
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.

Вы можете сделать то же самое с любыми папками и контентом, которые вы хотите "в исключительных случаях" держать вне gitignored папок / файлов.

Вывод :

Обязательно отмените игнорирование всех каталогов пути, которые вы хотите отменить

НО

Обязательно игнорируйте все содержимое не проигнорированных каталогов, которые вы хотите игнорировать

Артур Бушар
источник
2

Вы можете попробовать это:

!**/themes/*

Где :

  • ! : negate ignore (включить)
  • **: любое дерево каталогов (рекурсия), поэтому вам не нужно указывать путь к папке
  • 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папке для любого сайта, который я создаю в корне.

Обратите внимание, что он не будет игнорировать файлы в корне, только каталоги :)

Надеюсь это поможет.

Генри
источник
-1

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

/wp-config.php
Джаскаран Сингх
источник