Как игнорировать файлы в каталоге в 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 Студийные проекты и решения

больше примеров с конкретным использованием языка можно найти здесь (благодаря комментарию Криса Макнайта):

https://github.com/github/gitignore


пути, которые содержат косые черты, берутся относительно каталога, содержащего .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