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

2 голосов
/ 10 августа 2016

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

Сначала просто используйте 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
2 голосов
/ 12 февраля 2019

После нескольких попыток я наконец нашел решение [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
2 голосов
/ 02 сентября 2018

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

!**/themes/*

Где :

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

Вот мое решение, которое предполагает проверку на 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 голос
/ 28 февраля 2017

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

# 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 голосов
/ 29 апреля 2019

Другое простое решение:

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

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

Вывод:

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

НО

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

0 голосов
/ 24 февраля 2017

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

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

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

...