Gitignore исключить папку не работает

.gitignore Не работает исключение (отмена) игнорирования (со восклицательным знаком !) — причина. Как исправить

Primary tabs

Forums:

Ранее мы уже говорили об одной ситуации, когда .gitignore «не работает», в этой же заметке рассмотрим ситуацию связанную уже непосредственно с правилами написанными в этом файле.

Сразу скажем, что проверять работу правил можно такой командой.

Главная мысль

Если родительская папка (а не её содержимое) данного элемента была проигнорирована ранее в каком-то правиле, то уже не получается отменить данном правило для её потомка.

It is not possible to re-include a file if a parent directory of that file is excluded.

— это было актуально до версии 2.8 в будущем, может быть исправят.

Пример

Пусть у нас есть директория, в которой мы хотим всё игнорировать, кроме самой этой директории — в этом случае нам достаточно закинуть в неё такой .гитигнор:

Но предположим, что нам захотелось не игнорировать ещё одну подпапку (в этой) скажем её название images — то есть нам тоже хочется сделать, чтобы она сохранилась по контролем, а содержимое не нужно. Тогда если мы напишем так:

(используем .gitkeep) — то исключение
!images/.gitkeep уже не сработает так как предыдущее правило звездочки * уже отправила родительскую для гиткипа папку в игнор (см. «Главную мысль» выше).

Как правильно сохранить поддиректорию без содержимого в .gitignore если нужно игнорировать родителя

А потому правильно сохранить подпапку можно так (содержимое игнора родительской папки):

Разберем эти правила подробнее:

  • /* — игнорирует всё в данной папке (в которой лежит .gitignore), но не саму её, что очень важно — если просто поставить звездочку, то мы подпадём под правило, что если родитель проинорирован, то вернуть потомка уже нельзя
  • !.gitignore — отмена игнорирования самого файла
  • !images/ — отменяем игнор папки (чтобы гиткип внутри её не подпал под правило)
  • /images/* — но игнорим все содержимое
  • !foiv_images/.gitkeep — но не игнорим гиткип

Источник

Gitignore исключить папку не работает

Часто при работе над проектом, использующим Git, вы хотите исключить передачу определенных файлов или каталогов в удаленный репозиторий.

Файл .gitignore указывает, какие неотслеживаемые файлы должен игнорировать Git .

Какие файлы следует игнорировать?

Игнорируемые файлы обычно представляют собой файлы, специфичные для платформы, или автоматически созданные из сборочных систем. Ниже приводятся некоторые общие примеры:

  • Runtime файлы, такие как log , lock , cache или временные файлы ( tmp ).
  • Файлы с конфиденциальной информацией, такие как пароли или ключи API.
  • Каталоги зависимостей, такие как /vendor или /node_modules .
  • Build каталоги, такие как /public или /dist .
  • Системные файлы, такие как .DS_Store или Thumbs.db
  • Конфигурационные файлы IDE или текстового редактора.
Читайте также:  Не работает приставка для телевизора мгтс

Шаблоны .gitignore

.gitignore — это простой текстовый файл, в каждой строке которого содержится шаблон файла или каталога, который необходимо проигнорировать.

.gitignore использует glob шаблоны для сопоставления имен файлов с символами подстановки (Это что-то вроде регулярных выражений). Если у вас есть файлы или каталоги, содержащие шаблон подстановки (например * ), вы можете использовать один обратный слеш ( \* ), чтобы экранировать такой символ.

Комментарии

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

Символ косой черты ( / ) представляет собой разделитель каталогов. Наклонная черта в начале шаблона относится к директории, в которой находится файл .gitignore .
Если шаблон начинается со слеша, то он соответствует файлам и каталогам только в корне хранилища.

Если шаблон не начинается со слэша, он соответствует файлам и каталогам в любом каталоге или подкаталоге.

Если шаблон заканчивается косой чертой, то он соответствует только каталогам. Когда каталог игнорируется, все его файлы и подкаталоги также игнорируются.

Имена файлов

Самый простой шаблон — это просто имя файла без каких-либо специальных символов.

Шаблон Примеры совпадений
/access.log access.log
access.log access.log
logs/access.log
var/logs/access.log
build/ build

Символы подстановки

* — Символ звездочки соответствует нулю или более символам.

ШАБЛОН ПРИМЕРЫ СОВПАДЕНИЙ
*.log error.log
logs/debug.log
build/logs/error.log

** — Два соседних символа звездочки соответствуют любому файлу или нулю или более каталогам. Когда за ним следует косая черта ( / ), она соответствует только каталогам.

ШАБЛОН ПРИМЕРЫ СОВПАДЕНИЙ
logs/** Совпадает со всем, что находится в каталоге logs.
**/build var/build
pub/build
build
foo/**/bar foo/bar
foo/a/bar
foo/a/b/c/bar

? — Вопросительный знак соответствует любому отдельному символу.

ШАБЛОН ПРИМЕРЫ СОВПАДЕНИЙ
access?.log access0.log
access1.log
accessA.log
foo?? fooab
foo23
foo0s

Квадратные скобки

[…] — Совпадает с любыми символами, заключенными в квадратные скобки. Когда два символа разделены дефисом — обозначает диапазон символов. Диапазон включает в себя все символы, находящиеся между этими двумя символами. Диапазон может быть алфавитным или цифровым.

Если первый символ после [ является восклицательным знаком ( ! ), то образец соответствует любому символу, кроме символов из указанного набора.

ШАБЛОН ПРИМЕРЫ СОВПАДЕНИЙ
*.[oa] file.o
file.a
*.[!oa] file.s
file.1
file.0
access.2.log access.0.log
access.1.log
access.2.log
file.[a-c].out file.a.out
file.b.out
file.c.out
file.[a-cx-z].out file.a.out
file.b.out
file.c.out
file.x.out
file.y.out
file.z.out
access.[!0-2].log access.3.log
access.4.log
access.Q.log

Исключающие шаблоны

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

ШАБЛОН ПРИМЕРЫ СОВПАДЕНИЙ
*.log
!error.log
error.log or logs/error.log will not be ignored

Пример .gitignore

Ниже приведен пример того, как может выглядеть ваш файл .gitignore:

Локальный .gitignore

Локальный файл .gitignore обычно помещается в корневую директорию хранилища. Однако вы можете создать несколько файлов .gitignore в различных подкаталогах в вашем репозитории. Шаблоны в файлах .gitignore сопоставляются относительно директории, в которой находится файл.
Шаблоны, определенные в файлах, которые находятся в каталогах нижнего уровня (подкаталогах), имеют приоритет перед файлами в каталогах верхнего уровня.

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

Персональные правила игнорирования

Шаблоны, специфичные для вашего локального репозитория и не подлежащие распространению в других репозиториях, должны быть установлены в файле .git/info/exclude .
Например, этот файл можно использовать для игнорирования сгенерированных файлов из ваших личных инструментов проекта.

Глобальный .gitignore

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

Файл может называться по вашему усмотрению и храниться в любом месте. Наиболее распространенным местом хранения этого файла является домашний каталог. Вам придется вручную создать файл и настроить Git для его использования.

Например, чтобы установить

/.gitignore_global в качестве глобального файла игнорирования Git, выполните следующие действия:

1. Создайте файл:

2. Добавьте этот файл в Git-конфигурацию:

3. Откройте файл в текстовом редакторе и добавьте в него свои правила.

Глобальные правила особенно полезны при игнорировании определенных файлов, которые вы никогда не захотите фиксировать, таких как файлы с конфиденциальной информацией или скомпилированные исполняемые файлы.

Игнорирование ранее зафиксированных файлов

Файлы в вашей рабочей копии могут отслеживаться или не отслеживаться.

Чтобы проигнорировать файл, который был ранее зафиксирован, вам нужно будет удалить его из индекса, а затем добавить правило для файла в .gitignore :

Опция —cached говорит не удалять файл из рабочего дерева, а только удалять его из индекса.

Для рекурсивного удаления каталога используйте параметр -r :

Если вы хотите удалить файл как из индексной, так и из локальной файловой системы, опустите опцию —cached .

При рекурсивном удалении файлов используйте опцию -n , которая выполнит пробный запуск и покажет, какие файлы будут удалены:

Отладка файла .gitignore

Иногда бывает сложно определить, почему тот или иной файл игнорируется, особенно если вы используете несколько файлов .gitignore или сложные шаблоны. В этом случае пригодится команда git check-ignore с опцией -v, которая указывает на то, что нужно отображать детали совпадающего шаблона.

Например, чтобы проверить, почему файл www/yarn.lock игнорируется, нужно выполнить следующее:

На выходе отображается путь к файлу игнорирования, номер соответствующей линии и фактический шаблон.

Команда также принимает в качестве аргументов более одного имени файла, и файл не обязательно должен существовать в рабочем дереве.

Отображение всех игнорируемых файлов

Команда git status с опцией -ignored отображает список всех проигнорированных файлов:

Заключение

Файл игнорирования .gitignore позволяет исключить файлы из проверки в репозитории. Файл содержит шаблоны, которые описывают, какие файлы и каталоги следует игнорировать.

Источник

gitignore не игнорирует папку

в корень моего проекта у меня есть . Внутри foo папка у меня есть . Я хотел бы игнорировать все изменения во всех файлах внутри моего . У меня есть это в моем gitignore :

папка проверена: она существует, и в ней есть файлы, которые нужно игнорировать. gitignore is commit Тэд. Однако, у меня есть файл, где я делаю moification и находится внутри моей . Когда я набираю

внутри git bash Я вижу файл, который должен был быть проигнорирован. В чем может быть причина и как я могу успешно игнорировать все файлы в моей папке bar?

обратите внимание, что файлы ранее игнорировались с той же строкой, но мне пришлось временно удалить эту строку в commit что-то на сервере. После commit , Я вернул линию в gitignore . Это было некоторое время назад, но теперь я заметил, что файлы будут в git status . Я ожидал бы, что смогу изменить игнорируемые файлы без они появляются в git status .

2 ответов

Я предполагаю, что эта папка была проверена в git раньше? Попробуйте запустить git rm —cached и проверьте еще раз.

EDIT: в коде была небольшая ошибка. Решение было: git rm -r —cached Однако этот ответ привел меня к решению, поэтому я его приму.

для меня, принятый ответ является частью решения, а не все решение. Возможно, другие шаги, которые я собираюсь опубликовать, были очевидны, но я пропустил их первым. Вот шаги, которые я предпринял, чтобы обеспечить мой .gitignore файл проигнорировал папку, которую я хотел проигнорировать:

  1. совершать любые изменения, которые вам нужно исправить/изменить.
  2. выполните эту команду: git rm -r —cached . (который удаляет все из индекса git, чтобы обновить репозиторий git)
  3. затем запустите эта команда: git add . (добавить все обратно в репо)
  4. наконец, зафиксируйте эти изменения с помощью git commit -m «.gitignore Fixed»

вы можете найти ссылку на статью, где я нашел решение здесь.

Источник

Не игнорируются файлы в .gitignore

Читаю книгу Test-Driven Development with Python, во второй главе описывается создание git-репозитория. Я следую всем инструкциям, но мой файл .gitignore не игнорирует записанное в нём. В чём проблема?

4 ответа 4

Подозреваю, что вы добавили файлы в индекс раньше, чем начали игнорировать. То есть до той git add . , который на скриншоте, была еще одна такая команда. Чтобы узнать точно, не хватает git status перед добавлением.

Если файл уже был добавлен, то изменение в .gitignore не вызывает удаления из текущего индекса (что логично и безопасно).

Если файлы только добавлены, но еще не включены в коммит

В данном конкретном случае именно так и есть. При этом достаточно удалить их из индекса. Данная команда возвращает индекс к HEAD, то есть состоянию последнего коммита.

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

В данном случае эти команды эквивалентны. Такое дублирование появилось в результате эволюционного развития функционала Git. Это в том числе отражено в документации и в сообщениях Git: где-то рекомендуется reset , где-то rm —cached .

Если игнорируемые файлы уже есть в последнем коммите

Возможна и такая ситуация, на всякий случай я опишу и ее. Здесь reset не сработает, нужен rm . Аргумент —cached заставляет Git удалить файл из индекса, но не трогать рабочую область. То есть он буквально индексирует удаление файла, хотя этого удаления не было. Если сделать это с файлом, который не игнорируется, то после коммита он будет в категории неотслеживаемых (untracked).

Если нужно убрать целую игнорируемую папку, добавляем ключ -r:

Эта удобная команда применяет rm ко всем файлам, указанным в .gitignore :

Теперь результат команды git rm нужно зафиксировать коммитом.

Источник

Оцените статью