.gitignore игнорировать все файлы, а затем рекурсивно разрешить *.foo

У нас уже несколько вопросов, похожих на это, но ни один из ответов не работает для меня.

Я хочу игнорировать все в папках ниже моего репозитория, кроме файлов с *.foo

(Если кому-то интересно, как это можно оправдать - я фактически создаю репозиторий git для всех моих проектов "Логика" - музыкальное программное обеспечение на Mac, но я хочу только сохранить фактические файлы проекта *. логика)

Я собираюсь описать это, так что мы все на одной тарелке. Вот что я делаю, начиная с нуля:

Настройка:

mkdir temp
cd temp
mkdir testdir
cd testdir
touch include.foo
touch dontinclude.bad
cd..
git init
touch .gitignore

Вставьте это значение в .gitignore

# Ignore all
/*

# But not these files...
!.gitignore
!*.foo

git статус

И единственный неископанный файл - .gitignore

если я набрал 'git add.' - без изменений, видно только .gitignore, и мои 2 файла игнорируются.

Почему это не работает и как вы можете изменить описанную выше процедуру, чтобы заставить ее работать?

Здесь очень похожий вопрос, откуда я получил файл .gitignore. Я использую git --version 1.7.7 (также попытался 1.7.3) - .gitignore игнорировать все файлы, а затем рекурсивно разрешает файлы определенного типа

Ответ 1

Ваша проблема в том, что шаблон /* в начале соответствует всем файлам и каталогам на верхнем уровне, включая testdir, поэтому все внутри testdir игнорируется.

Это то, что вы хотите:

# Ignore everything
*
# Don't ignore directories, so we can recurse into them
!*/
# Don't ignore .gitignore and *.foo files
!.gitignore
!*.foo

Когда вы делаете git add . с этой конфигурацией, вы должны найти только те файлы .gitignore и *.foo, которые перечислены как изменения, которые необходимо выполнить.