Каков правильный синтаксис для .gitignore
файла, чтобы игнорировать файлы в каталоге?
Будет ли это
config/databases.yml
cache/*
log/*
data/sql/*
lib/filter/base/*
lib/form/base/*
lib/model/map/*
lib/model/om/*
или
/config/databases.yml
/cache/*
/log/*
/data/sql/*
/lib/filter/base/*
/lib/form/base/*
/lib/model/map/*
/lib/model/om/*
?
.gitignore
различие между файлами и каталогами , что он игнорирует? например, означает лиdata
противdata/
разные вещи?data
будет игнорировать файлы и каталоги, которые соответствуют,data/
будет игнорировать только каталоги, которые соответствуют.Ответы:
ФОРМАТ ШАБЛОНА
Пустая строка не соответствует ни одному файлу, поэтому она может служить разделителем для удобства чтения.
Строка, начинающаяся с
#
комментария.Необязательный префикс,
!
который отменяет шаблон; любой соответствующий файл, исключенный предыдущим шаблоном, снова будет включен. Если шаблон с отрицанием соответствует, это переопределит источники шаблонов с более низким приоритетом.Если шаблон заканчивается косой чертой, он удаляется с целью следующего описания, но он будет только находить совпадение с каталогом. Другими словами,
foo/
будет соответствовать каталогfoo
и пути под ним, но не будет совпадать с обычным файлом или символической ссылкойfoo
(это согласуется с тем, как pathspec работает в git в целом).Если шаблон не содержит косой черты
/
, git обрабатывает его как шаблон оболочки и проверяет совпадение с путевым именем относительно местоположения.gitignore
файла (относительно верхнего уровня рабочего дерева, если не из.gitignore
файла).В противном случае git рассматривает шаблон как глобус оболочки, подходящий для использования
fnmatch(3)
с помощьюFNM_PATHNAME
флага: подстановочные знаки в шаблоне не будут совпадать с/
именем в пути. Например,Documentation/*.html
соответствует,Documentation/git.html
но неDocumentation/ppc/ppc.html
илиtools/perf/Documentation/perf.html
.Начальная косая черта соответствует началу пути. Например,
/*.c
соответствует,cat-file.c
но нетmozilla-sha1/sha1.c
.Вы можете найти больше здесь
git help gitignore
или
man gitignore
источник
man
страницы или официального документа - лучший формат для SO ...Это было бы первым. Перейти по расширениям, а не структура папок.
Т.е. мой пример игнорирования разработки на C #:
Обновить
Я думал, что предоставлю обновление из комментариев ниже. Хотя он не отвечает непосредственно на вопрос OP, см. Следующие примеры для получения дополнительных примеров
.gitignore
синтаксиса.Сообщество вики (постоянно обновляется):
.gitignore для проектов и решений Visual Studio
Больше примеров с использованием определенного языка можно найти здесь (благодаря комментарию Криса Макнайта):
https://github.com/github/gitignore
источник
range
. Так что это совпадает,*.Obj
а также*.obj
.Пути, содержащие косую черту, считаются относительными к каталогу, содержащему файл .gitignore - обычно это верхний уровень вашего хранилища, хотя вы также можете разместить их в подкаталогах.
Итак, поскольку во всех приведенных вами примерах пути содержат косую черту, две версии идентичны. Единственный раз, когда вам нужно поставить ведущую косую черту, это когда ее уже нет на пути. Например, чтобы игнорировать foo только на верхнем уровне хранилища, используйте
/foo
. Простое написаниеfoo
игнорирует все, что называется foo, в любом месте хранилища.Ваши подстановочные знаки также избыточны. Если вы хотите игнорировать весь каталог, просто назовите его:
Единственная причина использовать подстановочные знаки, как у вас есть, если вы собираетесь впоследствии игнорировать что-то в каталоге:
источник
Начальная косая черта указывает, что запись игнорирования должна быть действительной только в отношении каталога, в котором находится файл .gitignore. При указании
*.o
игнорируются все файлы .o в этом каталоге и все его подкаталоги, в то время как/*.o
они просто игнорируются в этом каталоге , а опять-таки/foo/*.o
игнорируются только в /foo/*.o.источник
Если вы хотите поместить файл .gitignore на верхний уровень и заставить его работать для любой папки ниже, используйте его
/**/
.Например, чтобы игнорировать все
*.map
файлы в/src/main/
папке и подпапках, используйте:источник
**
. Одного мне было достаточно.Оба примера в этом вопросе на самом деле очень плохие, что может привести к потере данных!
Мой совет: никогда не
/*
добавляйте каталоги в файлах .gitignore, если у вас нет веских причин!Хорошей причиной будет, например, то, что написал Джефроми: «если вы собираетесь впоследствии что-то игнорировать в каталоге» .
Причина, по которой этого не следует делать, заключается в том, что добавление
/*
к каталогам, с одной стороны, работает таким образом, что оно правильно игнорирует все содержимое каталога, но, с другой стороны, имеет опасный побочный эффект:Если вы выполняете
git stash -u
(для временного хранения отслеживаемых и неотслеживаемых файлов) илиgit clean -df
(для удаления неотслеживаемых, но сохраняющих игнорируемые файлы) в своем хранилище, все каталоги, которые игнорируются с добавлением,/*
будут безвозвратно удалены !Некоторый фон
Я должен был выучить это трудным путем. Кто-то в моей команде
/*
добавлял некоторые каталоги в нашем .gitignore. Со временем у меня были случаи, когда определенные каталоги внезапно исчезали. Каталоги с гигабайтами локальных данных, необходимых нашему приложению. Никто не мог объяснить это, и я всегда хочу повторно загрузить все данные. Через некоторое время я понял, что это может быть связано сgit stash
. Однажды я захотел почистить локальный репозиторий (сохраняя при этом игнорируемые файлы), и я использовал,git clean -df
и мои данные снова исчезли. На этот раз мне хватило и исследовало проблему. Я наконец понял, что причина в приложении/*
.Я предполагаю, что это может быть как-то объяснено тем фактом, что
directory/*
игнорируется все содержимое каталога, но не сам каталог. Таким образом, это не считается отслеживаемым или игнорируемым, когда вещи удаляются. Хотяgit status
иgit status --ignored
приведу немного другую картину на нем.Как воспроизвести
Вот как воспроизвести поведение. В настоящее время я использую Git 2.8.4.
Каталог, вызываемый
localdata/
с помощью фиктивного файла в нем (important.dat
), будет создан в локальном репозитории git, и его содержимое будет игнорироваться при добавлении/localdata/*
в.gitignore
файл. Когда одна из двух упомянутых команд git выполняется сейчас, каталог будет (неожиданно) потерян.Если вы сделаете
git status --ignored
здесь, вы получите:Сейчас либо делаю
или
В обоих случаях якобы игнорируемый каталог
localdata
исчезнет!Не уверен, что это можно считать ошибкой, но я думаю, что это по крайней мере функция, которая никому не нужна.
Я сообщу об этом в список разработки git и посмотрю, что они об этом думают.
источник
Это было бы:
или, возможно, даже:
в случае, если это
filter
иform
есть единственные каталоги в lib, которые имеютbase
подкаталог, который нужно игнорировать (см. пример того, что вы можете сделать со звездочками).источник
Первый. Эти пути к файлам являются относительными от того, где находится ваш файл .gitignore.
источник
Я поддерживаю сервис на основе GUI и CLI, который позволяет
.gitignore
очень легко создавать шаблоны на https://www.gitignore.io .Вы можете либо ввести нужные шаблоны в поле поиска, либо установить псевдоним командной строки и запустить
$ gi swift,osx
источник
Пример файла .gitignore может выглядеть так, как показано ниже для проекта Android Studio
источник