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

Я видел похожие вопросы ( 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 ответа

Решение

@SimonBuchan - это правильно.

С мерзавца 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
Другие вопросы по тегам