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

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

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

root (git repo)
-/wordpress
- -/(WordPress Site 1)/wp-content/themes
- -/(WordPress Site 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.

Ответы

Ответ 1

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

# 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-patterns-work-in-gitignore
how-do-gitignore-exclusion-rules-actually-work


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

НЕ работал:

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

Ответ 2

Я пробовал выше, и они не работали так хорошо. здесь следует более хороший подход: 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 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 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/

Ответ 3

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

*

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

/*

Ответ 4

Попробуйте следующие ответы:

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

# Ignore everything
*

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

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

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

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

/*
/*/
!/bin/

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

Ответ 5

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

Ответ 6

Ответ Ярина работал на меня, вот моя версия (мне не нужен подкаталог /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 included here, after the negated patterns. 
wp-content/themes/index.php

Ответ 7

Скажем, что у вас есть структура каталогов:

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

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

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

Это неправильно! Сложная вещь с gitignore заключается в том, что вам нужно сначала включить родительский ("private") каталог, прежде чем вы сможете разрешить его дочерний каталог ( "newspilot" ), который будет включен в фиксации.

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

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

Ответ 8

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

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

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

Надеюсь, это поможет кому-то лучше понять потребность в рекурсивном методе.

Ответ 9

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

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

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

Ответ 10

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

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

# Ignore everything
/*

# Not these directories
!folder/

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

Ответ 11

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

Сначала просто используйте 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 был единственным, который все еще отображается как Untracked, когда мы закончили.

Начните добавлять правила:

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

Повторите процесс до тех пор, пока этот фиктивный файл не будет отображаться только как Untracked:

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

Ответ 12

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

!**/themes/*

Где:

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

Ответ 13

После нескольких попыток я наконец нашел решение [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

Ответ 14

Вот мое решение, предполагающее извлечение в 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/ bare repo. Следующий хук 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.

Ответ 15

Вот как я это сделал:

# 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

Ответ 16

Я нахожусь в одной лодке, пытаясь управлять кучей сайтов 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 для любого сайта, который я создаю в корне.

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

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

Ответ 17

Еще одно простое решение:

Вы хотите игнорировать все файлы 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

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

Заключение :

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

НО

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

Ответ 18

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

/wp-config.php