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