Как игнорировать файлы в каталоге в 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/*
?
Ответы
Ответ 1
ФОРМАТ PATTERN
-
Пустая строка не соответствует файлам, поэтому она может служить разделителем для удобства чтения.
-
В качестве комментария выступает строка, начинающаяся с #
.
-
Дополнительный префикс !
, который отрицает шаблон; любой сопоставимый файл, исключенный предыдущим шаблоном, снова будет включен. Если совпадение с отрицательным шаблоном, это переопределит источники шаблонов с более низким приоритетом.
-
Если шаблон заканчивается косой чертой, он удаляется для целей следующего описания, но он будет находить совпадение с каталогом. Другими словами, foo/
будет соответствовать каталогу foo
и его под ним, но не будет соответствовать регулярному файлу или символической ссылке foo
(это согласуется с тем, как метод pathspec работает вообще в git),.
-
Если шаблон не содержит косой черты /
, git рассматривает его как шаблон оболочки оболочки и проверяет соответствие имени пути относительно местоположения файла .gitignore
(относительно toplevel рабочего дерева, если не из файла .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
Ответ 2
Это будет первая. Перейдите также расширениями, а не структурой папок.
т.е. мой пример С# development ignore file:
#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 (постоянно обновляется):
.gitignore для проектов и решений Visual Studio
Дополнительные примеры с конкретным использованием языка можно найти здесь (спасибо комментарию Криса Макнайна):
https://github.com/github/gitignore
Ответ 3
Пути, содержащие косые черты, воспринимаются относительно каталога, содержащего файл .gitignore - обычно верхнего уровня вашего репозитория, хотя вы также можете поместить их в подкаталоги.
Итак, поскольку во всех приведенных вами примерах пути содержат косые черты, две версии идентичны. Единственный раз, когда вам нужно поставить ведущую косую черту, - это когда в пути уже нет. Например, чтобы игнорировать foo только на верхнем уровне репозитория, используйте /foo
. Просто запись foo
игнорирует все, что называется foo в любом месте в репозитории.
Ваши подстановочные знаки также являются излишними. Если вы хотите игнорировать весь каталог, просто назовите его:
lib/model/om
Единственная причина использования подстановочных знаков, как у вас есть, заключается в том, что вы намерены впоследствии игнорировать что-то в каталоге:
lib/model/om/* # ignore everything in the directory
!lib/model/om/foo # except foo
Ответ 4
Ведущая косая черта указывает, что запись игнорирования должна быть действительной только в отношении каталога, в котором находится файл .gitignore. Задание *.o
будет игнорировать все файлы .o в этом каталоге и всех поддиректорах, тогда как /*.o
просто игнорирует их в этом каталоге, а снова /foo/*.o
будет игнорировать их только в/foo/*.o.
Ответ 5
Если вы хотите поместить файл .gitignore на верхний уровень и заставить его работать для любой папки ниже, используйте /**/
.
например. игнорировать все файлы *.map
в папке /src/main/
и вложенных папок:
/src/main/**/*.map
Ответ 6
Оба примера в этом вопросе на самом деле очень плохие, что может привести к потере данных!
Мой совет: никогда не добавляйте /*
к каталогам в файлах .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
) будет создан в локальном хранилище мерзавца и содержимое будет проигнорировано, поставив /localdata/*
в .gitignore
файл. Когда одна из двух упомянутых команд 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 и посмотрю, что они об этом думают.
Ответ 7
Первый. Эти пути к файлам относятся относительно вашего файла .gitignore.
Ответ 8
Это будет:
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
, который нужно игнорировать (см. его в качестве примера того, что вы можете сделать со звездочками).
Ответ 9
Я поддерживаю службу на основе GUI и CLI, которая позволяет легко создавать шаблоны .gitignore
на https://www.gitignore.io.
p > Вы можете ввести типы шаблонов в поле поиска или установить псевдоним командной строки и запустить
$ gi swift,osx
Ответ 10
Образец файла .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
Ответ 11
Как начинающий, я спрашивал, какой формат или тип файла должен быть, так что я был сбит с толку, не так ли? .text.py.docx или какой он должен быть? Я не мог найти ответ, потому что не стоит упоминать его ясно, но, как я сказал, я новичок, это сбивало с толку, поэтому я нашел ответ, и я хотел бы поставить его здесь для справки, я уверен, что у кого-то будет то же самое вопрос. Таким образом, тип файла -.gitignore, файл не будет иметь имени, и его специальный файл, который будет обнаруживать git, просто зайдите в редактор кода, щелкните новый файл и задайте имя .gitignore
- файл будет создан, и у него не будет никакого имя и внутри него вы можете перечислить, какие файлы вы хотите игнорировать, как объяснено другими
![example]()