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

89

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

науфал
источник

Ответы:

108

@SimonBuchan прав.

Начиная с git 1.8.2, Resources/** !Resources/**/*.fooработает.

Джим Г.
источник
1
Это работает для меня, небольшая настройка, мне просто нужно удалить каталоги и все, что ниже них, что я и сделал: DirectoryName1/** DirectoryName1/**/*для каждого из них. Сначала удаляются каталоги, но вам нужен второй, чтобы удалить все типы файлов.
Scala Enthusiast
27

Лучший ответ - добавить файл Resources / .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

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

Бен Мартин
источник
2
Это печально .. Действительно, у меня будут более глубокие каталоги, поэтому я
остановлюсь
См. Дополнительные сведения об этом же решении здесь: stackoverflow.com/questions/7803689/… - также указано выше OP @nawfal
здесь
7

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

Тьяго
источник
5
Если кто-то столкнется с этим конкретным вариантом использования, вы можете git rm --cached <path to files>удалить эти игнорируемые файлы из git, оставив их в файловой системе.
slothluvchunk
5

Либо я делаю это неправильно, либо принятый ответ больше не работает с текущим git.

Я действительно нашел правильное решение и разместил его почти под тем же вопросом здесь . За подробностями обращайтесь сюда.

Решение:

# Ignore everything inside Resources/ directory
/Resources/**
# Except for subdirectories(won't be committed anyway if there is no committed file inside)
!/Resources/**/
# And except for *.foo files
!*.foo
Александр Стельмацонек
источник
2
Да, у меня это работает. Добавление !/Resources/**/было решающим, чтобы git не игнорировал подкаталоги.
Johnster