Использование.gitignore для игнорирования всего, кроме определенных каталогов
Моя проблема в том, что в моем репозитории git есть несколько сайтов WordPress, из которых я хочу выборочно фиксировать только содержимое моего themes
папки, игнорируя при этом остальные избыточные файлы, найденные в WordPress.
Я использовал файлы.gitignore, чтобы игнорировать типы файлов раньше, но можно ли использовать их наоборот - то есть игнорировать все, НО определенный путь к папке?
root (git repo)
- / WordPress
- - / (WordPress Site 1) / wp-content / themes
- - / (WordPress Site 2) / wp-контент / темы
- - / (WordPress Site 3)/wp-контент / темы
Спасибо-
ОБНОВИТЬ:
На основании ответов я сделал следующее, но это не работает. Есть идеи?
# 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
папки.
14 ответов
Вот как я это сделал - вам, по сути, нужно идти по пути, вы не можете использовать более одного уровня в любом направлении:
# 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/**
Я попробовал выше, и они не работали так хорошо. Гораздо лучший подход заключается в следующем: 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/
Попробуйте эти ответы:
Заставьте.gitignore игнорировать все, кроме нескольких файлов
# Ignore everything * # But not these files... !.gitignore !script.pl !template.latex # etc... # ...even if they are in subdirectories !*/
Как мне сказать Git игнорировать все, кроме подкаталога?
Это игнорирует корневые файлы и корневые каталоги, а затем игнорирует корневой каталог bin:
/* /*/ !/bin/
Таким образом, вы получите весь каталог bin, включая подкаталоги и их файлы.
Допустим, у вас есть такая структура каталогов:
– sites
– -all
– – – -files
– – – – – -private
– – – – – – – -newspilot
– -default
– – – -files
– – – – – -private
– – – – – – – -newspilot
Если вы хотите разрешить только сайты / все / файлы / личные / Газетчик и сайты / по умолчанию / файлы / приват / Газетчик, вы можете сначала попробовать это:
sites/*/files/*
!sites/*/files/private/newspilot
Это не верно! Хитрость с gitignore заключается в том, что вы должны сначала разрешить включение родительского ("частного") каталога, прежде чем разрешить включение его дочернего каталога ("magazilot") в коммиты.
sites/*/files/*
!sites/*/files/private
sites/*/files/private/*
!sites/*/files/private/newspilot
http://www.christianengvall.se/gitignore-exclude-folder-but-include-a-subfolder/
Если вы префикс шаблона с восклицательным знаком (!
) он отменяет любой предыдущий шаблон, который исключил его. Таким образом, по-видимому, вы можете игнорировать все, а затем разрешить только то, что вы хотите, используя этот шаблон.
Мне нужно было игнорировать все, кроме одной папки с подкаталогами.
Для меня это работает
# Ignore everything
/*
# Not these directories
!folder/
# Not these files
!.gitignore
!.env
!file.txt
После нескольких попыток я наконец нашел решение [1]:
/*/
/*.*
!.git*
!/wordpress
Объяснение построчно:
- Игнорировать все каталоги в корне.
- Игнорировать все файлы с расширениями в корне.
- Разрешать
.gitignore
сам (и потенциально.gitattributes
). - Разрешить нужный каталог со всеми подкаталогами
[1] Ограничения (о которых я знаю):
- Он не игнорирует файлы без расширения в корне (и добавление
/*
сломал бы всю схему). - Каталог, который вы хотите включить в строку 4 (
wordpress
в этом случае) не может иметь.
во имя (например,wordpress.1
не будет работать). Если у него есть.
, затем удалите строку 2 и найдите другой способ исключить все файлы в корне. - Проверено только на Windows с
git version 2.17.1.windows.2
Еще одно простое решение:
Вы хотите игнорировать все файлы 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.
Вы можете делать то же самое с любыми папками и содержимым, которые вы хотите "исключительно" хранить в папках / файлах
Заключение:
Обязательно игнорируйте все каталоги пути, который вы хотите игнорировать
НО
Обязательно игнорируйте все содержимое незарегистрированных каталогов, которые вы хотите игнорировать
Я всегда зацикливаюсь на этом, даже после того, как возвращаюсь к этому вопросу много раз. Я придумал подробный процесс, делающий это шаг за шагом:
Сначала просто используйте 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/
..
Повторяйте процесс до тех пор, пока этот фиктивный файл не станет единственным, который все еще отображается как 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
Ответ Ярина сработал для меня, вот моя версия (мне не нужно /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
Для тех, кто ищет более чистое решение, попробуйте следующее.
Как уже упоминалось в комментариях к этому ответу, вы должны использовать этот метод рекурсивно.
В этом примере у вас есть настройка сайта на ./
где твой .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
Надеюсь, это поможет кому-то лучше понять необходимость рекурсивного метода.
Опоздал на вечеринку, но вот что я использую для неизвестной глубины (принятое решение требует известной глубины)
/*
!.gitignore
!wp-content/
!*/
таким образом, все под wp-контентом не игнорируется.
Вот мое решение, которое предполагает проверку в 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
Вы можете попробовать это:
!**/themes/*
Где:
- !: отрицать игнорировать (включить)
- **: любое дерево каталогов (рекурсия), поэтому вам не нужно указывать путь к папке
- Темы: ваша папка для включения (может быть что угодно)
- *: любой файл в этой папке, вы также можете включить все подпапки с **, и вместо включения любого файла (*) вы можете указать *.css, *.xy
Вот как я это сделал:
# 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 Сьерра
Это единственный файл, который в большинстве случаев игнорируется, потому что у вас есть wp-config-sample.php, которым вы можете поделиться с другими.
/wp-config.php
Я в одной лодке пытаюсь управлять кучей сайтов 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
Папка для любого сайта, который я создаю в корне.
Обратите внимание, что он не будет игнорировать файлы в корне, только каталоги:)
Надеюсь это поможет.