3

[ ПРИМЕЧАНИЕ: это не обычный "Git по-прежнему отслеживает файлы, которые я только что добавил в .gitignore!"проблема Это противоположность этому.]

У меня есть полная структура каталогов сайта в Git-репозитории. Используемая мной CMS по умолчанию поставляется с файлом .gitignore:

# Ignore paths that contain user-generated content.
sites/*/files/
sites/*/private/

Обратите внимание, что все каталоги sites/*/files исключены. Но, как я делаю свои сайты, есть определенная подпапка, которую я хочу включить в репо. Поэтому после запуска моего репо с вышеупомянутым .gitignore я изменил его так:

# Ignore paths that contain user-generated content.
sites/*/files/
!sites/*/files/content/
!sites/*/files/content/*
sites/*/private/

Насколько я понимаю, отрицательные шаблоны, которые я добавил выше, должны означать, что сайты / * / files / content / и их содержимое включены в репозиторий, а остальные сайты / * / files игнорируются. И когда я не забываю обновить свой файл .gitignore перед выполнением моего первого коммита, он работает как запланировано.

Но когда я забываю обновить .gitignore на более поздний срок, как обычно, я не могу заставить Git добавлять новые файлы, не заставляя его полностью игнорировать файл .gitignore. Я запускаю это:

> git add sites/default/files/content/

И получить это обратно:

The following paths are ignored by one of your .gitignore files:
sites/default/files
Use -f if you really want to add them.
fatal: no files added

Почему да, Git, этот каталог игнорируется в строке 2 .gitignore, но в строках 3 и 4 говорится об исключении для конкретной папки, о которой я вас просил!

Я знаю, что могу использовать -f, чтобы добавить его напрямую, но затем мне придется делать это снова и снова при любом будущем коммите, который добавляет файлы в этот каталог.

Есть страницы все более в Интернете , которые говорят о том , как обновление .gitignore не делает Git игнорировать уже отслеживаются файлы, но я не могу найти ничего , что говорит о том , как это не делает Git отслеживать недавно освобожденные файлы.

Во многих местах говорится, что git update-index может использоваться для решения подобных проблем, но я не могу заставить его работать на меня. У него около миллиона возможных флагов, поэтому, возможно, я не наткнулся на правильный (или комбинацию нескольких).

TL; DR: Как я могу заставить Git наблюдать новые исключения в моем файле .gitignore?

2 ответа2

2

Я думаю, что этот ответ объясняет это лучше всего. Отрицание работает только для повторного включения файлов, которые были явно проигнорированы другим правилом. Когда вы игнорируете вложенный каталог, Git даже не спускается в него и, следовательно, никогда не видит и не исключает явно ваш файл.

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

1

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

Для этого мне нужно было включить / исключить каждую папку вплоть до файла, который я хотел исключить:

vendor/* !vendor/tfox/ vendor/tfox/* !vendor/tfox/mpdf-port-bundle/ vendor/tfox/mpdf-port-bundle/* !vendor/tfox/mpdf-port-bundle/TFox/ vendor/tfox/mpdf-port-bundle/TFox/* !vendor/tfox/mpdf-port-bundle/TFox/MpdfPortBundle/ vendor/tfox/mpdf-port-bundle/TFox/MpdfPortBundle/* !vendor/tfox/mpdf-port-bundle/TFox/MpdfPortBundle/mpdf/ vendor/tfox/mpdf-port-bundle/TFox/MpdfPortBundle/mpdf/* !vendor/tfox/mpdf-port-bundle/TFox/MpdfPortBundle/mpdf/config_fonts.php

Этот набор правил выглядит очень громоздким, но, похоже, это правильный способ сделать это.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .