Как мне сказать Git игнорировать все, кроме подкаталога?

219

Я хочу игнорировать все файлы в моем хранилище, кроме тех, которые находятся в binподкаталоге. Я попытался добавить следующее к моему .gitignore:

*
!bin/*

Однако это не дает желаемого эффекта: я создал новый файл внутри bin/, но это git statusвсе равно показывает nothing to commit (working directory clean).

Какие-либо предложения?

Майкл Гёрц
источник

Ответы:

275

Это игнорирует корневые файлы и корневые каталоги, а затем игнорирует корневой каталог bin:

/*
/*/
!/bin/

Таким образом, вы получите весь каталог bin, включая подкаталоги и их файлы.

Тайлер Лэйнг
источник
25
По некоторым причинам это не работает последовательно для меня. У меня есть две строки /stuff/и !/stuff/specific/, но он по-прежнему игнорирует / вещи / конкретные /
LB--
1
@ LB-- У меня был подобный вопрос, и git check-ignore -vсказал мне , что это из - за~/.gitignore
Герни Alex
@gurneyalex Я обнаружил, что это исправляет себя, если я удаляю локальное репо и повторно клонирую его, это должно быть ошибка.
LB--
2
Является ли / * / необходимым?
Алекс Бейкер
3
Это не сработало для меня. Я должен был добавить !/bin/к своему корневому .gitignoreфайлу, но затем я должен был добавить /bin/.gitignoreфайл с !*... Выполнение только одного из этих изменений не сработало. Это сработало только после объединения обоих изменений.
Фелипе Брам
115

Здесь, как игнорировать все, кроме одного каталога " MY_SUPER_DUPER_TEMPLATE_directory " в некотором каталоге

Структура: / bitrix / templates / MY_SUPER_DUPER_TEMPLATE_directory

/*
!/bitrix
/bitrix/*
!/bitrix/templates
/bitrix/templates/*
!/bitrix/templates/MY_SUPER_DUPER_TEMPLATE_directory
*.DS_Store
*.gitignore
Андрей Тищенко
источник
1
Это творило чудеса за то, что я игнорировал пакет поставщика Laravel, который я модифицировал! Спасибо, вы избавили меня от многих головных болей
Мария Виларо,
Это должно быть выбрано как лучший ответ.
Бахман.
63

Вы должны исключить все на пути к пунктам назначения, но вы должны включить пункты назначения:

Примечание. Это файл исключения (например, .gitignore), поэтому логика инвертирована. Игнорировать все, кроме каталога tsp, игнорировать все в каталоге tsp, кроме каталога src ...

/*
!/tsp
/tsp/*
!/tsp/src
/tsp/src/*
!/tsp/src/*.h
!/tsp/src/*.cpp
!/tsp/src/data.txt
!/.gitignore
nikc
источник
11
+1 за принцип включения каталога, затем, исключая его содержимое, затем, включая нужный подкаталог и т. Д. В итоге я использовал этот ответ в своих проектах.
Иоанн Иисус
40

Единственная проблема, с которой вы столкнулись, заключается в том, что сам binкаталог не соответствует bin/*шаблону, поэтому git даже не просматривает binкаталог.

На ум приходят два решения.

.gitignore :

*
!/bin/
!bin/*

или

.gitignore :

*
!/bin/

bin/.gitignore :

!*

Я предпочитаю второе решение, так как первое решение не прекратит игнорировать файлы в binкаталоге, которые находятся в подкаталогах, которые не вызываются bin. Это может иметь или не иметь значения в вашей ситуации.

CB Bailey
источник
2
Не работал для меня У меня должен быть такой .gitignore, чтобы он работал: # Ignore everything * # But not these files... !/wp-content/ !/wp-content/plugins/ !/wp-content/plugins/my_plugin/ !/wp-content/plugins/my_plugin/* в комментариях нет блочного кода?
xlttj
1
Ответ Тайлера имеет лучшее решение для одного файла
Ярин
19

Из официального git doc один из примеров гласит:

Пример, чтобы исключить все, кроме определенной директории foo / bar (обратите внимание на / * - без косой черты подстановочный знак также исключит все, что находится внутри foo / bar):

$ cat .gitignore
# exclude everything except directory foo/bar
/*
!/foo
/foo/*
!/foo/bar

Для объяснения о ведущем слеше: когда использовать ведущий слеш в gitignore .

solstice333
источник
Спасибо миллион, это сработало для меня! Заметьте другим, что порядок строк здесь важен, например, вы не можете иметь! / Foo / bar перед / foo / *.
Iamsodarncool
13

Попробуйте следовать в последней версии GIT.

*
!*/
!/path/to/your/dir/**
Kirby
источник
на самом деле это должно быть! / path / to / your / dir / ** для последней строки
faham
@faham, да, только что добавил это.
Кирби
11

Я думаю, что лучшим способом было бы привязать каждый шаблон к верхнему каталогу git, запустив шаблон с косой чертой:

/*
!/public_html
!/.gitignore

Вместо игнорирования всех файлов он будет игнорировать только файлы верхнего уровня, а не те, которые находятся в каталоге, который вы не хотите игнорировать.

Джейк
источник
8

Это .gitignoreработает для меня:

*/
/*
!bin/
Trianam
источник
5

попробуйте эту неясную ошибку.

!bin**/**

Надеюсь, поможет :)

Поддержка документации по git

PS: попробуйте сначала, прежде чем комментировать.

Дэвид
источник
0

Я должен был сделать это недавно:

*
!sub-dir/
!sub-dir/*

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

Генри
источник