игнорирование любого каталога bin в проекте git

1237

У меня есть структура каталогов, как это:

.git/
.gitignore
main/
  ...
tools/
  ...
...

Внутри main и tools, и любого другого каталога, на любом уровне, может быть каталог 'bin', который я хочу игнорировать (и я хочу игнорировать все, что находится под ним). Я пробовал каждый из этих шаблонов в .gitignore, но ни один из них не работает:

/**/bin/**/*
/./**/bin/**/*
./**/bin/**/*
**/bin/**/*
*/bin/**/*
bin/**/*
/**/bin/* #and the others with just * at the end too

Может кто-нибудь мне помочь? Первый шаблон (который, я думаю, должен работать) прекрасно работает, если я сделаю это:

/main/**/bin/**/*

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

Это на Windows, используя последнюю версию msysgit.

РЕДАКТИРОВАТЬ: еще одна вещь, есть файлы и каталоги, которые имеют подстроку «bin» в своих именах, я не хочу, чтобы они игнорировались :)

Бен Хаймерс
источник
14
Возможно, кто-то найдет это полезным: если у вас есть несколько репозиториев, и у каждого есть один и тот же файл .gitignore, вы можете поместить его в «общее» местоположение и запустить> git config --global core.excludefile ~ / .gitignore_global Последний параметр - путь к общему месту. PS Я новичок в Git и не уверен, что это рекомендация «лучшей практики». Поэтому, пожалуйста, дайте мне знать, если вы не хотите этого делать. Спасибо.
Будда
**Синтаксис кажется сейчас (март 2013, мерзавец 1.8.2) официально задокументированы: см мой ответ ниже
VonC
2
Если кто-то хочет прочитать самую актуальную версию страницы руководства, см. Страницу руководства gitignore (5) .
более дружелюбный вариант, если вы устали читать эссе на одну строчку информации atlassian.com/git/tutorials/saving-changes/…
suazithustra

Ответы:

1835

До версии 1.8.2 **особого значения в .gitignore. Начиная с **версии 1.8.2, git означает ноль или более подкаталогов (см. Примечания к выпуску ).

Способ игнорировать все каталоги, называемые bin, где-либо ниже текущего уровня в дереве каталогов, с помощью .gitignoreфайла с шаблоном:

bin/

На manстранице приведен пример игнорирования каталога, вызываемого fooпо аналогичной схеме.

Редактировать: Если у вас уже есть какие-либо папки bin в вашем git index, которые вы больше не хотите отслеживать, вам нужно явно удалить их. Git не остановит отслеживание путей, которые уже отслеживаются только потому, что теперь они соответствуют новому .gitignoreшаблону. Выполнить удаление папки ( rm ) только из индекса ( --cached ) рекурсивно ( -r ). Пример командной строки для корневой папки bin:

git rm -r --cached bin
CB Bailey
источник
72
Начиная с мерзавцем 1.8.2, мерзавец будет принимать **в .gitignoreфайлах (источник: 1.8.2 журнала изменений )
Carlos Campderrós
15
это binто же самое bin/?
Нисба
29
@Nisba, они разные, binбудут игнорировать файлы с именем bin, а bin/для каталогов с именем bin
Рани Хейр
8
так как я упал на это: имя папки в git-команде IS чувствительно к регистру :) "bin! = Bin" - возможно, я уделю кому-то несколько минут этим советом :)
dba
1
В windows10 вы не можете создать файл .gitignore, вам нужно создать gitignore.txt, а затем запустить ren gitignore.txt .gitignore в командной строке, чтобы создать этот файл
потрепанный
463

.gitignoreВашей мечты , кажется:

bin/

на верхнем уровне.

Михаил Крелин - хакер
источник
Большое спасибо за вашу помощь, просто не забудьте проверить пример пропущенных файлов: git checkout bin *
Крис Сим,
1
положить его в gitignore_global
μολὼν.λαβέ
@ GAlexander, почему кто-то хочет игнорировать bin / каталоги? Они часто имеют версионный контент. И глобальное игнорирование не повлияет на других пользователей хранилища.
Майкл Крелин - хакер
234

Я думаю, что стоит упомянуть для начинающих git:

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

git rm --cached

Поэтому, если вы хотите, чтобы add игнорировал некоторые каталоги в вашем локальном репозитории (которые уже существуют) после редактирования .gitignore, вы хотите запустить это в своем корневом каталоге.

git rm --cached -r .
git add .

Это в основном «освежит» ваше локальное хранилище и нестандартные игнорируемые файлы.

Видеть:

http://git-scm.com/docs/git-rm ,

https://help.github.com/articles/ignoring-files/

plancys
источник
если я обычно делаю git add -Aкоммиты, могу ли я использовать это вместо этого? и можно ли заменить точку с -A в первой строке?
ajax333221
69

До этого **никогда не работал должным образом, но, начиная с git 1.8.2 (8 марта 2013 г.) , он явно упоминается и поддерживается:

Шаблоны в файлах .gitignoreи .gitattributesфайлах могут иметь **/в качестве шаблона, который соответствует 0 или более уровням подкаталога .

Например, " foo/**/bar" соответствует " bar" в " foo" себе или в подкаталоге " foo".

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

/main/**/bin/
VonC
источник
46
[Bb]in/

соответствует верхнему и нижнему регистру

wisbucky
источник
2
[B]in/чтобы быть единственным верхним регистром
Ганк
Как позволить Binигнорировать только папку и разрешить binкоммитить в git? [B]in/будет и совершать, Binи bin.
Ганк
5
Это должно сделать, @Gank: Bin/ !bin/
Марко Дж
34

Я не видел, чтобы это упоминалось здесь, но это, кажется, чувствительно к регистру. Как только я перешел на / Bin, файлы были проигнорированы, как и ожидалось.

Cory
источник
3
Это не ответ на первоначальный вопрос, который был явно о bin, нет Bin.
CB Bailey
50
Хотя это и не ответ, это добавляет полноты для других, ищущих по той же проблеме (я, только сейчас).
Джей
25

[Bb]in решит проблему, но ... Вот более обширный список вещей, которые вы должны игнорировать (пример списка от GitExtension):

#ignore thumbnails created by windows
Thumbs.db
#Ignore files build by Visual Studio
*.user
*.aps
*.pch
*.vspscc
*_i.c
*_p.c
*.ncb
*.suo
*.bak
*.cache
*.ilk
*.log
[Bb]in
[Dd]ebug*/
*.sbr
obj/
[Rr]elease*/
_ReSharper*/
Jaider
источник
3
Примечание. Подобные вещи должны находиться в вашем GLOBAL gitignore (обычно в вашем домашнем каталоге.) Проект gitignore должен игнорировать только то, что относится к вашему проекту (например, файлы .o для приложения на C).
BraveNewCurrency
18

Если вы ищете отличный глобальный .gitignoreфайл для любого решения Visual Studio (.NET) - я рекомендую вам использовать это: https://github.com/github/gitignore/blob/master/VisualStudio.gitignore

AFAIK имеет самый полный .gitignoreдля .NET проектов.

Йохен ван Вайлик
источник
5
Это на самом деле не отвечает на вопрос, но это именно то, что я искал.
Дейв
18

Шаг 1: Добавьте следующее содержимое в файл .gitignore.

# User-specific files
*.suo
*.user
*.userosscache
*.sln.docstates

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
bld/
[Bb]in/
[Oo]bj/

# Visual Studio 2015 cache/options directory
.vs/

Шаг 2: Убедитесь, что вступили в силу

Если проблема все еще существует, то это потому, что настройки в .gitignore могут игнорировать только те файлы, которые изначально не отслеживались . Если некоторые файлы уже включены в систему контроля версий, изменение .gitignore недопустимо. Чтобы полностью решить эту проблему, вам нужно открыть Git Bash или Консоль диспетчера пакетов (см. Скриншот ниже), чтобы запустить следующие команды в корневой папке хранилища.

$ git rm -r --cached .
$ git add .
$ git commit -m 'Update .gitignore'

Консоль PM Тогда вопрос будет полностью решен.

Браво Йенг
источник
8

Буквально ни один из ответов на самом деле не работал для меня; единственный, который работал для меня, был (на Linux):

**/bin
(yes without the / in the end)

git version 2.18.0 
AnthonyC
источник
Это игнорировало также все папки, названные binв подкаталогах?
vineeshvs
5

В качестве уведомления;

Если вы думаете, что .gitignoreэто не работает каким-то образом (добавленная foo/*в него папка, но git statusвсе равно показывающая содержимое (я) этой папки как измененное или что-то подобное), вы можете использовать эту команду;

git checkout -- foo/*

K-Gun
источник
3

для 2.13.3 и выше, запись только bin в ваш файл .gitignore должна игнорировать bin и все его подкаталоги и файлы

бункер

Нихил Каранджкар
источник
2

Добавление ** / bin / в файл .gitignore помогло мне (Примечание: папка bin не была добавлена ​​в индекс).

Dhwaneel
источник
1

Если рисунок внутри .gitignoreзаканчивается косой чертой/ , он найдет только совпадение с каталогом.

Другими словами, bin/будет соответствовать каталогу binи путям под ним, но не будет совпадать с обычным файлом или символической ссылкой bin.


Если шаблон не содержит косой черты, то , как в binGit, обрабатывает его как шаблон оболочки (жадный). Так что лучше всего будет использовать простой /bin.

bin не будет лучшим решением для этой конкретной проблемы.

прости
источник
Вы имели в виду «начать с» /?
vineeshvs
0

В моем случае кодирование файла gitignore было проблематичным, проверьте, является ли это UTF-8

Яцек Плеснар
источник