Использование.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

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

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

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

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

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

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

Другие вопросы по тегам