Git игнорировать подпапки


438

У меня много проектов в моем решении .Net. Я хотел бы исключить все папки «bin / Debug» и «bin / Release» (и их содержимое), но все же включить саму папку «bin» и все содержащиеся в ней DLL.

.gitignore с «bin /» игнорирует папки «Debug» и «Release», но также любые dll, содержащиеся в папке «bin».

«bin / Debug» или «bin / Release» в файле .gitignore не исключают каталоги, если только я полностью не квалифицирую шаблон игнорирования как «Solution / Project / bin / Debug» - что я не хочу делать как я Мне нужно будет включить этот полный шаблон для каждого проекта в моём решении, а также добавить его для любых новых проектов.

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


Зачем добавлять библиотеки DLL? Если вы ссылаетесь на сторонние библиотеки DLL, возможно, имеет смысл добавить общую папку, на которую ссылаются все ваши проекты.
Пэдди

6
Пэдди прав - если это сторонние библиотеки DLL, они, вероятно, должны быть организованы отдельно от вашего кода. Для меня, однако, звучит так, будто вы проверяете свои собственные продукты для сборки, что обычно не так, как вы хотите. Вы используете git для отслеживания информации , которая полностью содержится в коде и конфигурации сборки. Продукты, ну, продукты. Отслеживание их вызывает проблемы - например, что если вы измените код, но забудете создать и проверить новые продукты?
Каскабель

У меня была проблема в исключении подпапок. Перепробовал все, включая точные образцы, написанные здесь, но безуспешно. Наконец, я добавил дополнительную пустую строку между шаблонами папок, и она работает. Возможно проблема с кодировкой. У меня есть окна и закодированы в UTF8.
RoadBump

Ответы:


552

Вы пробовали подстановочные знаки?

Solution/*/bin/Debug
Solution/*/bin/Release

В git версии 1.8.2 вы также можете использовать **подстановочный знак для соответствия любому уровню подкаталогов:

**/bin/Debug/
**/bin/Release/

8
Это работает, за исключением случаев, когда есть подпапка с другим проектом, например, в Solution / Module / Project, поэтому на данный момент я добавил / * / * / bin / Debug и / * / * / * / bin / Debug (для sub папки). Похоже, вы должны добавить подпапку для каждого уровня в вашей структуре каталогов.
Марсель

1
@Marcel: Ну, git, конечно же, не собирается игнорировать файлы, о которых вы не говорите - он игнорирует все, что соответствует групповым символам, ни больше, ни меньше.
Каскабель

Я думаю, что двойная звезда пересекает границы каталогов, то есть: / ** / bin / Debug
Трент,

11
@ Тарас: К сожалению, это не так.
Туукка Мустонен

2
В Visual Studio произошла ошибка, связанная с **. Должно быть исправлено сейчас. ссылка
Богак

106

Вы можете использовать .gitignore на верхнем уровне, чтобы игнорировать все каталоги в проекте с одинаковыми именами. Например:

Debug/
Release/

Это должно обновиться немедленно, чтобы оно было видно, когда вы делаете git status. Убедитесь, что эти каталоги еще не добавлены в git, так как это переопределит игнорирование.


То же самое можно сделать, добавив шаблоны в $GIT_DIR/.git/info/excludeфайл OP .
Тим Хениган

1
Разница в том, что файл .gitignore будет следовать коду, поэтому он применяется везде. Принимая во внимание, что файл исключений является локальным только для вашего репозитория, то есть он применяется только для этого конкретного репозитория. Если у других коммиттеров нет причин для фиксации этих каталогов, я бы рекомендовал использовать .gitignore.
Андреас

1
Другая проблема заключается в том, что в вашем решении есть проект Debug, который также будет игнорироваться. Я думаю, что решение представляет собой комбинацию всех ответов и комментариев - реструктурируйте решение, чтобы сохранить общие или ссылочные библиотеки DLL в другой папке, а затем игнорировать «bin /» и / или использовать подстановочные знаки.
Марсель

16
+1 За комментарий о том, что каталоги еще не добавлены в git. Если уже добавлено в git, сделайте:git rm -rf DirectoryName/
Левибостиан

57

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


1
Есть ли у вас шанс уточнить? Я перепробовал всевозможные варианты этого и не могу git addигнорировать каталог и все файлы во всех подкаталогах этого каталога. Я попытался dirname/, dirname/*, dirname/**, dirname/*/*, даже в отчаянии dirname/*/*/*, dirname/*/*/*/*, dirname/*/*/*/*/*.
Chris

3
*/*игнорирует все подкаталоги, но не файлы в текущем каталоге. Игнорировать определенный подкаталог - это обычное использование gitignore. dirname, dirname/И dirname/*вся работа для меня. Что-нибудь в этом каталоге уже зафиксировано?
mgold

Это совершенно новое хранилище - я удаляю весь .gitкаталог между попытками, а git initзатем git add --all .(также пытался без --all), используя 1.9.4.msysgit.1. Каждый непустой подкаталог в моем названном каталоге добавляется в индекс (проверено в TortoiseGit и git status). При .gitignoreзапуске нет соответствующих строк, !но должен быть конфликт. Решено пока, удалив папки во время add. Думаю, это что-то, что потребует немного больше копаний, чтобы предоставить необходимую информацию для диагностики. Спасибо, что заверили меня, что я не неправильно понимаю синтаксис.
Крис

Что если мне нужно игнорировать папку внутри папки, но не первую? Как и в форуме / ignorethisfolder / ... но он не должен игнорировать папку с именем forum
Жан Карлос Ракоски

Это не работает для меня, игнорируя каталог, имя которого начинается с точки. « /. » и «. * / *» тоже не работают.
Тони

44

Все приведенные выше ответы верны, но я не думаю, что упомянуто то, что как только вы добавите файл из этого каталога в репозиторий, вы не сможете игнорировать этот каталог / подкаталог, содержащий этот файл (git будет игнорировать эту директиву ).

Чтобы игнорировать уже добавленные файлы, запустите

$ git rm --cached

В противном случае вам придется сначала удалить все файлы из целевого каталога репозитория, а затем вы можете проигнорировать эту папку.


12
git rm - кэшируется, если вы хотите, чтобы они не отслеживались / не имели отношения к истории, но хотите сохранить файлы локально нетронутыми.
Эрик Реппен

29

Помимо размещения правильных записей в вашем файле .gitignore, если вы пытаетесь игнорировать что-то, уже добавленное в репозиторий, вы должны сделать git rm -r /path/to/dirи зафиксировать это, прежде чем добавлять каталог в ваш файл .gitignore. Иначе единственное, что git будет игнорировать, это ваша директива игнорирования.


19

Единственный способ заставить это работать на моей машине - это сделать так:

# Ignore all directories, and all sub-directories, and it's contents:
*/*

#Now ignore all files in the current directory 
#(This fails to ignore files without a ".", for example 
#'file.txt' works, but 
#'file' doesn't):
/*.*

#Only Include these specific directories and subdirectories:
!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/

Обратите внимание, как вы должны явно разрешить контент для каждого уровня, который вы хотите включить. Так что, если у меня есть подкаталоги 5 глубоко под темами, мне все еще нужно разобрать это.

Это из комментария @ Ярина здесь: https://stackoverflow.com/a/5250314/1696153

Это были полезные темы:

Я тоже пробовал

*
*/*
**/**

а также **/wp-content/themes/**

или /wp-content/themes/**/*

Ничто из этого не сработало для меня. Много следов и ошибок!


13

Чтобы исключить контент и подкаталоги:

**/bin/*

Чтобы просто исключить все подкаталоги, но взять содержимое, добавьте «/»:

**/bin/*/

9

Чтобы игнорировать все подкаталоги, вы можете просто использовать:

**/

Это работает с версией 1.8.2 git.


8

Общий способ игнорирования всех подпапок при продолжении отслеживания файлов, находящихся в /binкаталоге, заключается в добавлении следующей строки в файл .gitignore вашего проекта:

bin/*/*

Если вы хотите игнорировать только определенные именованные подпапки, вы можете сделать:

bin/Debug/*
bin/Release/*

в северном направлении если binкаталог не находится в корне вашего проекта (рядом с файлом .gitignore), то вместо eg. bin/*/*вам может понадобитьсяpath/to/bin/*/*

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.