Правильно игнорировать все файлы рекурсивно в определенной папке, за исключением определенного типа файла

Я видел похожие вопросы (1, 2 и 3), но я не получаю от них правильное решение.

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

Это наиболее распространенное решение (во всех повторяющихся вопросах)

# Ignore everything
*

# Don't ignore directories, so we can recurse into them
!*/

# Don't ignore .gitignore
!.gitignore

# Now exclude our type
!*.foo

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

Наконец-то я получил решение здесь. Решение состоит в том, чтобы добавить еще один .gitignore файл в папку Resources. Это работает правильно.

Могу ли я достичь того же с одним файлом игнорирования? Я обнаружил, что многие файлы игнорируются в разных каталогах немного неуклюже.

Это то, чего я пытаюсь достичь:

# Ignore everything under Resources folder, not elsewhere
Resources

# Don't ignore directories, so we can recurse into them
!*Resources/

# Now exclude our type
!*.foo

Но это дает противоположный результат. Он игнорирует типы *.foo и отслеживает другие файлы.

Ответ 2

Лучшим ответом является добавление файла ресурсов / .gitignore в разделе Ресурсы, содержащие:

# Ignore any file in this directory except for this file and *.foo files
*
!/.gitignore
!*.foo

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

# Ignore any file but *.foo under Resources. Update this if we add deeper directories
Resources/*
!Resources/*/
!Resources/*.foo
Resources/*/*
!Resources/*/*/
!Resources/*/*.foo
Resources/*/*/*
!Resources/*/*/*/
!Resources/*/*/*.foo
Resources/*/*/*/*
!Resources/*/*/*/*/
!Resources/*/*/*/*.foo

Вам нужно будет отредактировать этот шаблон, если вы добавите каталоги глубже, чем указано.

Ответ 3

Это может выглядеть глупо, но убедитесь, что вы еще не добавили папку/файлы, которые вы пытаетесь игнорировать до индекса. Если вы это сделали, неважно, что вы помещаете в свой .gitignore файл, папки/файлы все равно будут поставлены.