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

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

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

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

* 1015 Благодарения и *

ОБНОВЛЕНИЕ:

На основании ответов я сделал следующее, но оно не работает. Есть идеи?

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

Ответы [ 17 ]

108 голосов
/ 09 марта 2011

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

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

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

Кроме того, эти ответы полезны:
how-do-negated-templates-work-in-gitignore
how-do-gitignore-exclusion-rules-фактически-work


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

НЕ работала:

!**/wp-content/themes/
!**/wp-content/themes/**
75 голосов
/ 07 декабря 2011

Я попробовал вышеупомянутое, и они не работали так хорошо.Гораздо лучший подход заключается в следующем: 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/
17 голосов
/ 07 марта 2016

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

*

изменить на

/*
9 голосов
/ 09 марта 2011

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

9 голосов
/ 09 марта 2011

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

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

# Ignore everything
*

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

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

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

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

/*
/*/
!/bin/

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

4 голосов
/ 19 июля 2016

Скажем, у вас есть структура каталогов, подобная этой:

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

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

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/

4 голосов
/ 25 апреля 2011

Ответ Ярина сработал для меня, вот моя версия (мне не нужен подкаталог /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
3 голосов
/ 27 апреля 2018

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

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

# Ignore everything
/*

# Not these directories
!folder/

# Not these files
!.gitignore
!.env
!file.txt
3 голосов
/ 29 февраля 2016

Для тех, кто ищет чистящее средство , попробуйте следующее.

Как уже упоминалось в комментариях этого ответа, вы должны использовать этот метод рекурсивно.

В этом примере у вас есть настройка веб-сайта на ./, где находится папка .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 голосов
/ 08 марта 2017

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

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

таким образом, все под wp-контентом не игнорируется.

...