Файл gitignore
Файл .gitignore
используется для того, чтобы определить какие файлы и папки не нужно добавлять в git
репозиторий.
Мы конечно могли бы вручную добавлять нужные файлы в репозиторий, например так:
git add path/to/file
Однако это было бы очень трудоемко, гораздо проще использовать команду которая добавит все файлы в каталоге проекта:
git add .
Но что если нам не нужны абсолютно все файлы, а есть файлы например в каталоге /cache
или /images
или /runtime
проекта, которые генерируются в процессе работы. Они не должны быть добавлены в репозиторий.
Тут нам и нужен .gitignore
. Вам нужно его самим создать и разместить в корне проекта либо нужной подпапке.
Где должен находиться этот файл
Файл может находиться в корне проекта или любом подкаталоге, можно задать глобальный файл но этот вариант менее удобен.
Примеры содержимого .gitignore
файла:
# Игнорировать каталог в любом месте
node_modules/
# Игнорировать файлы логов в любом месте
*.log
# Игнорировать каталог в корне
/dist
# Игнорировать файл с окончанием
.env
Построение шаблонов
Символ #
Строки начинающиеся с решетки #
, являются комментариями и игнорируются. Пустые строки можно использовать для улучшения читаемости файла и для группировки связанных строк шаблонов.
Без символов
Если шаблон не начинается с косой черты, он соответствует файлам и каталогам в любом каталоге или подкаталоге, в котором находится .gitignore
.
access.log # Примеры совпадений: access.log и logs/access.log и var/logs/access.log
Символ /
/
в начале шаблона относится к каталогу или файлу, который находится в корне репозитория где находится файл .gitignore
. Когда каталог игнорируется, все его файлы и подкаталоги также игнорируются.
/access.log # Примеры совпадений: access.log
/
в конце шаблона, соответствует только каталогам. Когда каталог игнорируется, все его файлы и подкаталоги также игнорируются.
build/ # Примеры совпадений: build
Символ *
*
символ звездочки соответствует нулю или более символам.
*.log # Примеры совпадений: error.log и logs/debug.log и build/logs/error.log
Символ **
**
два символа звездочки соответствуют любому файлу или нулю или более каталогам.
Если за **
следует косая черта /
, соответствует только каталогам.
logs/** # Примеры совпадений: соответствует чему-либо в каталоге logs
**/build # Примеры совпадений: var/build и pub/build и build
foo/**/bar # Примеры совпадений: foo/bar и foo/a/bar и foo/a/b/c/bar
Символ ?
?
знак вопроса соответствует любому одиночному символу.
access?.log # Примеры совпадений: access0.log и access1.log и accessA.log
foo?? # Примеры совпадений: fooab и foo23 и foo0s
Символ [...]
[...]
соответствует любому из символов, заключенных в квадратные скобки. Когда два символа разделены -
это обозначает диапазон символов. Диапазон включает все символы, которые находятся между этими двумя символами. Диапазоны могут быть буквенными или числовыми.
Если первый символ после [
отрицание в виде !
, шаблон соответствует любому символу, кроме символов из указанного набора.
*.[oa] # Примеры совпадений: file.o и file.a
*.[!oa] # Примеры совпадений: file.s и file.1 и file.0
access.[0-2].log # Примеры совпадений: access.0.log и access.1.log и access.2.log
file.[ac].out # Примеры совпадений: file.a.out и file.b.out и file.c.out
file.[a-cx-z].out # Примеры совпадений: file.a.out и file.b.out и file.c.out и file.x.out и file.y.out и file.z.out
access.[!0-2].log # Примеры совпадений: access.3.log и access.4.log и access.Q.log
Символ !
!
отменяет, или повторно включает любой файл, который игнорируется предыдущим шаблоном. Исключением из этого правила является повторное включение файла, если его родительский каталог исключен.
*.log
!error.log
# error.log или logs/error.log не будут проигнорированы
Примеры шаблонов
Шаблон | Примеры соответствия | Пояснение* |
---|---|---|
**/logs |
logs/debug.log logs/monday/foo.bar build/logs/debug.log |
Добавьте в начало шаблона две звездочки, чтобы сопоставлять каталоги в любом месте репозитория. |
**/logs/debug.log |
logs/debug.log build/logs/debug.log только не: logs/build/debug.log |
Две звездочки можно также использовать для сопоставления файлов на основе их имени и имени родительского каталога. |
*.log |
debug.log foo.log .log logs/debug.log |
Одна звездочка — это подстановочный знак, который может соответствовать как нескольким символам, так и ни одному. |
*.log !important.log |
debug.log trace.log только не: important.log только не: logs/important.log |
Добавление восклицательного знака в начало шаблона отменяет действие шаблона. Если файл соответствует некоему шаблону, но при этом также соответствует отменяющему шаблону, указанному после, такой файл не будет игнорироваться. |
.log !important/.log trace.* |
debug.log important/trace.log только не: important/debug.log |
Шаблоны, указанные после отменяющего шаблона, снова будут помечать файлы как игнорируемые, даже если ранее игнорирование этих файлов было отменено. |
/debug.log |
debug.log только не: logs/debug.log |
Косая черта перед именем файла соответствует файлу в корневом каталоге репозитория. |
debug.log |
debug.log logs/debug.log |
По умолчанию шаблоны соответствуют файлам, находящимся в любом каталоге |
debug?.log |
debug0.log debugg.log только не: debug10.log |
Знак вопроса соответствует строго одному символу. |
debug[0-9].log |
debug0.log debug1.log только не: debug10.log |
Квадратные скобки можно также использовать для указания соответствия одному символу из заданного диапазона. |
debug[01].log |
debug0.log debug1.log только не: debug2.log только не: debug01.log |
Квадратные скобки соответствуют одному символу из указанного набора. |
debug[!01].log |
debug2.log только не: debug0.log только не: debug1.log только не: debug01.log |
Восклицательный знак можно использовать для указания соответствия любому символу, кроме символов из указанного набора. |
debug[a-z].log |
debuga.log debugb.log только не: debug1.log |
Диапазоны могут быть цифровыми или буквенными. |
logs |
logs logs/debug.log logs/latest/foo.bar build/logs build/logs/debug.log |
Без косой черты в конце этот шаблон будет соответствовать и файлам, и содержимому каталогов с таким именем. В примере соответствия слева игнорируются и каталоги, и файлы с именем logs |
logs/ |
logs/debug.log logs/latest/foo.bar build/logs/foo.bar build/logs/latest/debug.log |
Косая черта в конце шаблона означает каталог. Все содержимое любого каталога репозитория, соответствующего этому имени (включая все его файлы и подкаталоги), будет игнорироваться |
logs/**/debug.log |
logs/debug.log logs/monday/debug.log logs/monday/pm/debug.log |
Две звездочки соответствуют множеству каталогов или ни одному. |
logs/*day/debug.log |
logs/monday/debug.log logs/tuesday/debug.log только не: logs/latest/debug.log |
Подстановочные символы можно использовать и в именах каталогов. |
logs/debug.log |
logs/debug.log только не: debug.log только не: build/logs/debug.log |
Шаблоны, указывающие на файл в определенном каталоге, задаются относительно корневого каталога репозитория. (При желании можно добавить в начало косую черту, но она ни на что особо не повлияет.) |
Файлы из gitignore уже добавлены в репозиторий
Обратите внимание, что если файлы уже добавлены в git
репозиторий, то добавление их в .gitignore
не удалит эти файлы. Изменения в них будут продолжать отслеживаться и входить в коммиты, несмотря на то, что они есть в .gitignore
. Нам придется вручную их удалить из репозитория.
Команда bash
, которая удалит из git
репозитория те файлы, которые содержатся в файлах .gitignore
. При выполнении этой команды, файлы останутся у вас на диске, однако из репозитория они будут удалены:
git rm --cached `git ls-files -i --exclude-from=.gitignore`
Либо можно удалять файлы вручную, таким образом:
git rm --cached path/to/file
Если нужно удалить целую директорию из git
, то воспользуемся следующей командой:
git rm -r --cached path/to/directory
Параметр --cached
означает, что файлы будут удалены только из раздела проиндексированных файлов. На диске, в рабочем каталоге они останутся нетронутыми.
Как понять почему игнорируется конкретный файл
Запустите команду вместо path/to/file
следует указать путь к файлу, в итоге мы получим ответ в котором содержится конкретная строка .gitignore
, благодаря которой данный файл игнорируется:
git check-ignore -v path/to/file
Отобразить все игнорируемые файлы:
git status --ignored
Очистить проект от всех игнорируемых файлов:
git clean -fX