Как игнорировать файлы в каталоге в Git?
каков правильный синтаксис для .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/*
?
10 ответов
ФОРМАТ
пустая строка не соответствует файлам, поэтому она может служить разделителем для удобства чтения.
строка, начинающаяся с
#
является комментарием.необязательный префикс
!
который отрицает шаблон; любой соответствующий файл, исключенный предыдущим шаблоном, будет включен снова. Если отрицаемый шаблон совпадает, это переопределит шаблоны с более низким приоритетом источники.если шаблон заканчивается косой чертой, он удаляется для целей следующего описания, но он найдет только совпадение с каталогом. Другими словами,
foo/
будет соответствовать каталогfoo
и пути под ним, но не будут соответствовать обычному файлу или символической ссылкеfoo
(это согласуется с тем, как pathspec работает вообще в git).если шаблон не содержит косой черты
/
, git рассматривает его как шаблон глобуса оболочки и проверяет соответствие с именем пути относительно местоположения.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
это будет первое. Перейти к расширениям вместо структуры папок.
т. е. мой пример c# развития игнорировать файл:
#OS junk files
[Tt]humbs.db
*.DS_Store
#Visual Studio files
*.[Oo]bj
*.user
*.aps
*.pch
*.vspscc
*.vssscc
*_i.c
*_p.c
*.ncb
*.suo
*.tlb
*.tlh
*.bak
*.[Cc]ache
*.ilk
*.log
*.lib
*.sbr
*.sdf
ipch/
obj/
[Bb]in
[Dd]ebug*/
[Rr]elease*/
Ankh.NoLoad
#Tooling
_ReSharper*/
*.resharper
[Tt]est[Rr]esult*
#Project files
[Bb]uild/
#Subversion files
.svn
# Office Temp Files
~$*
обновление
Я думал, что предоставлю обновление из комментариев ниже. Хотя и не отвечая непосредственно на вопрос OP, см. следующие примеры .gitignore
синтаксис.
сообщество wiki (постоянно обновляется):
.пример для Visual Студийные проекты и решения
больше примеров с конкретным использованием языка можно найти здесь (благодаря комментарию Криса Макнайта):
пути, которые содержат косые черты, берутся относительно каталога, содержащего .gitignore file-обычно верхний уровень вашего репозитория, хотя вы также можете разместить их в подкаталогах.
Итак, поскольку во всех приведенных примерах пути содержат косые черты, две версии идентичны. Единственный раз, когда вам нужно поставить ведущую косую черту, когда есть не один уже в пути. Например, игнорировать foo только на верхнем уровне репозитория, использовать /foo
. Просто пишу foo
будет игнорировать все, что называется foo в любом месте репозитория.
ваши подстановочные знаки также избыточны. Если вы хотите игнорировать весь каталог, просто назовите его:
lib/model/om
единственная причина использовать подстановочные знаки, как у вас есть, если вы намерены впоследствии отменить игнорировать что-то в каталоге:
lib/model/om/* # ignore everything in the directory
!lib/model/om/foo # except foo
начальная косая черта указывает, что запись игнорировать должна быть действительна только в отношении каталога, в котором .файл gitignore находится. Указание *.o
будет игнорировать все .o файлы в этот каталог и все подкаталоги, в то время как /*.o
просто проигнорировал бы их в этом dir, в то время как снова,/foo/*.o
будет игнорировать их только в /foo/*.o.
если вы хотите поставить .файл gitignore на верхнем уровне и заставить его работать для любой папки под ним используйте /**/
.
Е. Г. игнорировать все *.map
файлы /src/main/
папка и подпапки использовать:
/src/main/**/*.map
оба примера в вопросе на самом деле очень плохие примеры, которые могут привести к потере данных!
мой совет: никогда не добавлять /*
в каталогах .файлы gitignore, если у вас нет веской причины!
хороший повод будет например, что Jefromi писал: "если вы намерены впоследствии отменить что-то в каталоге".
причина, по которой это иначе не должно быть сделано, заключается в том, что добавление /*
в каталоги, с одной стороны, работают так, что он должным образом игнорирует все содержимое каталога, но, с другой стороны, он имеет опасный побочный эффект:
при выполнении git stash -u
(для временного хранения отслеживаемых и неотслеживаемых файлов) или git clean -df
(для удаления неотслеженных, но игнорируемых файлов) в вашем репозитории все каталоги, которые игнорируются с добавлением /*
будет безвозвратно удалены!
некоторые предпосылки
I пришлось учиться на горьком опыте. Кто-то из моей команды добавил /*
к некоторым каталогам в нашем .гитюдного. Со временем у меня были случаи, когда некоторые каталоги внезапно исчезали. Каталоги с гигабайтами локальных данных, необходимых нашему приложению. Никто не мог объяснить это, и я всегда хотел повторно загрузить все данные. Через некоторое время я понял, что это может быть связано с git stash
. Однажды я хотел очистить свое локальное РЕПО (сохраняя игнорируемые файлы), и я использовал git clean -df
и и снова мои данные исчезли. На этот раз с меня было достаточно, и я занялся расследованием. Я, наконец, понял, что причина в приложении /*
.
полагаю, это можно как-то объяснить тем, что directory/*
игнорирует все содержимое каталога, но не сам каталог. Таким образом, это не считается отслеживается или игнорируется, когда вещи удаляются. Хотя git status
и git status --ignored
дать немного другую картину на нем.
как воспроизвести
вот как воспроизвести поведение. В настоящее время я использую Git 2.8.4.
каталог localdata/
с фиктивным файлом в нем (important.dat
) будет создан в локальном репозитории git, и содержимое будет проигнорировано, поставив /localdata/*
на . Когда одна из двух упомянутых команд git будет выполнена сейчас, каталог будет (неожиданно) потерян.
mkdir test
cd test
git init
echo "/localdata/*" >.gitignore
git add .gitignore
git commit -m "Add .gitignore."
mkdir localdata
echo "Important data" >localdata/important.dat
touch untracked-file
если вы git status --ignored
здесь получить:
On branch master
Untracked files:
(use "git add <file>..." to include in what will be committed)
untracked-file
Ignored files:
(use "git add -f <file>..." to include in what will be committed)
localdata/
теперь либо делать
git stash -u
git stash pop
или
git clean -df
в обоих случаях якобы проигнорировали каталог localdata
исчезнет!
не уверен, что это можно считать ошибкой, но я думаю, что это, по крайней мере, функция, которая никому не нужна.
я сообщу об этом в список разработки git и посмотрю, что они думают об этом.
что будет:
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/*/base
lib/model/map
lib/model/om
на случай, если это filter
и form
являются единственными каталогами в lib, которые имеют base
подкаталоге, который должен быть проигнорирован (см. Это как пример того, что можно сделать с asterics).
Я поддерживаю службу на основе GUI и CLI, которая позволяет генерировать .gitignore
шаблоны очень легко в https://www.gitignore.io.
вы можете либо ввести нужные шаблоны в поле поиска, либо установить псевдоним командной строки и запустить
$ gi swift,osx
пример .gitignore файл может выглядеть как один ниже для проекта Android Studio
# built application files
*.apk
*.ap_
# files for the dex VM
*.dex
# Java class files
*.class
# generated files
bin/
gen/
# Local configuration file (sdk path, etc)
local.properties
#Eclipse
*.pydevproject
.project
.metadata
bin/**
tmp/**
tmp/**/*
*.tmp
*.bak
*.swp
*~.nib
local.properties
.classpath
.settings/
.loadpath
YourProjetcName/.gradle/
YourProjetcName/app/build/
*/YourProjetcName/.gradle/
*/YourProjetcName/app/build/
# External tool builders
.externalToolBuilders/
# Locally stored "Eclipse launch configurations"
*.launch
# CDT-specific
.cproject
# PDT-specific
.buildpath
# Proguard folder generated by Eclipse
proguard/
# Intellij project files
*.iml
*.ipr
*.iws
.idea/
/build
build/
*/build/
*/*/build/
*/*/*/build/
*.bin
*.lock
YourProjetcName/app/build/
.gradle
/local.properties
/.idea/workspace.xml
/.idea/libraries
.DS_Store
.gradle/
app/build/
*app/build/
# Local configuration file (sdk path, etc)
local.properties
/YourProjetcName/build/intermediates/lint-cache/api-versions-6-23.1.bin
appcompat_v7_23_1_1.xml
projectFilesBackup
build.gradle
YourProjetcName.iml
YourProjetcName.iml
gradlew
gradlew.bat
local.properties
settings.gradle
.gradle
.idea
android
build
gradle