Как игнорировать файлы в каталоге в Git? - PullRequest
525 голосов
/ 16 декабря 2011

Каков правильный синтаксис для файла .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 ]

362 голосов
/ 16 декабря 2011

ФОРМАТ ШАБЛОНА

  • Пустая строка не соответствует файлам, поэтому она может служить разделителем для удобства чтения.

  • Строка, начинающаяся с #, служит комментарием.

  • Необязательный префикс !, который отменяет шаблон;любой соответствующий файл, исключенный предыдущим шаблоном, снова будет включен.Если шаблон с отрицанием соответствует, это переопределит источники шаблонов с более низким приоритетом.

  • Если шаблон заканчивается косой чертой, он удаляется с целью следующего описания, но он будет только находитьсовпадение с каталогом.Другими словами, 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

179 голосов
/ 16 декабря 2011

Это был бы первый.Идти также по расширениям вместо структуры папок.

Т.е. мой файл игнорирования разработки на 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.

Вики сообщества (постоянно обновляется):

.gitignore для VisualСтудийные проекты и решения

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

https://github.com/github/gitignore

126 голосов
/ 16 декабря 2011

Пути, содержащие косую черту, считаются относительными к каталогу, содержащему файл .gitignore - обычно это верхний уровень вашего хранилища, хотя вы также можете размещать их в подкаталогах.примеры, которые вы приводите, пути содержат косую черту, две версии идентичны.Единственный раз, когда вам нужно поставить начальную косую черту, это когда уже не в пути.Например, чтобы игнорировать foo только на верхнем уровне репозитория, используйте /foo.Простое написание foo будет игнорировать все, что называется foo, в любом месте хранилища.

Ваши символы подстановки также избыточны.Если вы хотите игнорировать весь каталог, просто назовите его:

lib/model/om

Единственная причина использовать подстановочные знаки, как у вас есть, если вы собираетесь впоследствии игнорировать что-то в каталоге:

lib/model/om/*      # ignore everything in the directory
!lib/model/om/foo   # except foo
77 голосов
/ 16 декабря 2011

Начальная косая черта означает, что запись игнорирования действительна только в отношении каталога, в котором находится файл .gitignore. Указание *.o будет игнорировать все файлы .o в этом каталоге и все подкаталоги, в то время как /*.o будет просто игнорировать их в этом каталоге, в то время как, опять же, /foo/*.o будет игнорировать их только в /foo/*.o.

.
31 голосов
/ 22 июня 2015

Если вы хотите поместить файл .gitignore на верхний уровень и заставить его работать для любой папки под ним, используйте /**/.

например. чтобы игнорировать все *.map файлы в папке /src/main/ и подпапках, используйте:

/src/main/**/*.map
28 голосов
/ 23 октября 2016

Оба примера в вопросе на самом деле являются очень плохими примерами, которые могут привести к потере данных!

Мой совет: никогда не добавляйте /* к каталогам в файлах .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 выполняется сейчас, каталог будет (неожиданно) потерян.

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 и посмотрю, что они об этом думают.

14 голосов
/ 16 декабря 2011

Было бы:

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, который необходимо игнорировать (см. Пример того, что можно сделать со звездочкой).

14 голосов
/ 16 декабря 2011

Первый. Эти пути к файлам относительно того, где находится ваш файл .gitignore.

4 голосов
/ 15 июля 2016

Я поддерживаю сервис на основе графического интерфейса и интерфейса командной строки, который позволяет очень легко создавать .gitignore шаблоны на https://www.gitignore.io.

. Вы можете либо ввести нужные шаблоны в поле поиска, либо установить командупсевдоним строки и запустить

$ gi swift,osx

0 голосов
/ 10 июля 2017

Пример файла .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
...