Правильно игнорировать все файлы рекурсивно в определенной папке, кроме файлов определенного типа
Я видел похожие вопросы ( 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
печатает и отслеживает другие файлы.
4 ответа
С мерзавца 1.8.2, Resources/** !Resources/**/*.foo
работает.
Лучший ответ - добавить файл Resources/.gitignore в разделе Resources, содержащий:
# 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
Вам нужно будет отредактировать этот шаблон, если вы добавите каталоги глубже, чем указано.
Это может выглядеть глупо, но проверьте, не добавили ли вы папку / файлы, которые вы пытаетесь игнорировать, в индекс раньше. Если вы это сделали, не имеет значения, что вы положили в свой файл.gitignore, папки / файлы все равно будут размещены.
Я делаю это неправильно или принятый ответ больше не работает с текущим git.
Я на самом деле нашел правильное решение и разместил его почти под тем же вопросом здесь. Для более подробной информации отправляйтесь туда.
Решение:
# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be commited anyway if there is no commited file inside)
!/Resources/**/
# And except for *.foo files
!*.foo