Игнорирование в Git
Git рассматривает каждый файл в вашей рабочей копии как файл одного из трех нижеуказанных типов.
1. Отслеживаемый файл — файл, который был предварительно проиндексирован или зафиксирован в коммите.
2. Неотслеживаемый файл — файл, который не был проиндексирован или зафиксирован в коммите.
3. Игнорируемый файл — файл, явным образом помеченный для Git как файл, который необходимо игнорировать.
Игнорируемые файлы — это, как правило, артефакты сборки и файлы, генерируемые машиной из исходных файлов в вашем репозитории, либо файлы, которые по какой-либо иной причине не должны попадать в коммиты. Вот некоторые распространенные примеры таких файлов:
- кэши зависимостей, например содержимое
/node_modules
или/packages
; - скомпилированный код, например файлы
.o
,.pyc
и.class
; - каталоги для выходных данных сборки, например
/bin
,/out
или/target
; - файлы, сгенерированные во время выполнения, например
.log
,.lock
или.tmp
; - скрытые системные файлы, например
.DS_Store
илиThumbs.db
; - личные файлы конфигурации IDE, например
.idea/workspace.xml
.
Игнорируемые файлы отслеживаются в специальном файле .gitignore
, который регистрируется в корневом каталоге репозитория. В Git нет специальной команды для указания игнорируемых файлов: вместо этого необходимо вручную отредактировать файл .gitignore
, чтобы указать в нем новые файлы, которые должны быть проигнорированы. Файлы .gitignore
содержат шаблоны, которые сопоставляются с именами файлов в репозитории для определения необходимости игнорировать эти файлы.
В этом документе рассматриваются следующие темы.
Шаблоны игнорирования в Git
Для сопоставления с именами файлов в .gitignore
используются шаблоны подстановки. С помощью различных символов можно создавать собственные шаблоны.
Шаблон | Примеры соответствия | Пояснение* |
---|---|---|
| Примеры соответствия | Пояснение* Добавьте в начало шаблона две звездочки, чтобы сопоставлять каталоги в любом месте репозитория. |
| Примеры соответствия | Пояснение* Две звездочки можно также использовать для сопоставления файлов на основе их имени и имени родительского каталога. |
| Примеры соответствия | Пояснение* Одна звездочка — это подстановочный знак, который может соответствовать как нескольким символам, так и ни одному. |
| Примеры соответствия | Пояснение* Добавление восклицательного знака в начало шаблона отменяет действие шаблона. Если файл соответствует некоему шаблону, но при этом также соответствует отменяющему шаблону, указанному после, такой файл не будет игнорироваться. |
| Примеры соответствия | Пояснение* Шаблоны, указанные после отменяющего шаблона, снова будут помечать файлы как игнорируемые, даже если ранее игнорирование этих файлов было отменено. |
| Примеры соответствия | Пояснение* Косая черта перед именем файла соответствует файлу в корневом каталоге репозитория. |
| Примеры соответствия | Пояснение* Знак вопроса соответствует строго одному символу. |
| Примеры соответствия | Пояснение* Квадратные скобки можно также использовать для указания соответствия одному символу из заданного диапазона. |
| Примеры соответствия | Пояснение* Квадратные скобки соответствуют одному символу из указанного набора. |
| Примеры соответствия | Пояснение* Восклицательный знак можно использовать для указания соответствия любому символу, кроме символов из указанного набора. |
| Примеры соответствия | Пояснение* Диапазоны могут быть цифровыми или буквенными. |
| Примеры соответствия | Пояснение* Без косой черты в конце этот шаблон будет соответствовать и файлам, и содержимому каталогов с таким именем. В примере соответствия слева игнорируются и каталоги, и файлы с именем logs |
| Примеры соответствия | Пояснение* Косая черта в конце шаблона означает каталог. Все содержимое любого каталога репозитория, соответствующего этому имени (включая все его файлы и подкаталоги), будет игнорироваться |
| Примеры соответствия | Пояснение* Минуточку! Разве файл |
| Примеры соответствия | Пояснение* Две звездочки соответствуют множеству каталогов или ни одному. |
| Примеры соответствия | Пояснение* Подстановочные символы можно использовать и в именах каталогов. |
| Примеры соответствия | Пояснение* Шаблоны, указывающие на файл в определенном каталоге, задаются относительно корневого каталога репозитория. (При желании можно добавить в начало косую черту, но она ни на что особо не повлияет.) |
Две звездочки (**) означают, что ваш файл .gitignore находится в каталоге верхнего уровня вашего репозитория, как указано в соглашении. Если в репозитории несколько файлов .gitignore, просто мысленно поменяйте слова «корень репозитория» на «каталог, содержащий файл .gitignore» (и подумайте об объединении этих файлов, чтобы упростить работу для своей команды)*.
Помимо указанных символов, можно использовать символ #, чтобы добавить в файл .gitignore
комментарии:
# ignore all logs
*.log
Если у вас есть файлы или каталоги, в имени которых содержатся спецсимволы шаблонов, для экранирования этих спецсимволов в .gitignore
можно использовать обратную косую черту (\):
# ignore the file literally named foo[01].txt
foo\[01\].txt
Связанные материалы
git branch
СМ. РЕШЕНИЕ
Изучите Git с помощью Bitbucket Cloud
Обычно правила игнорирования Git задаются в файле .gitignore
в корневом каталоге репозитория. Тем не менее вы можете определить несколько файлов .gitignore
в разных каталогах репозитория. Каждый шаблон из конкретного файла .gitignore
проверяется относительно каталога, в котором содержится этот файл. Однако проще всего (и этот подход рекомендуется в качестве общего соглашения) определить один файл .gitignore
в корневом каталоге. После регистрации файла .gitignore
для него, как и для любого другого файла в репозитории, включается контроль версий, а после публикации с помощью команды push он становится доступен остальным участникам команды. В файл .gitignore
, как правило, включаются только те шаблоны, которые будут полезны другим пользователям репозитория.
Персональные правила игнорирования в Git
В специальном файле, который находится в папке .git/info/exclude
, можно определить персональные шаблоны игнорирования для конкретного репозитория. Этот файл не имеет контроля версий и не распространяется вместе с репозиторием, поэтому он хорошо подходит для указания шаблонов, которые будут полезны только вам. Например, если у вас есть пользовательские настройки для ведения журналов или специальные инструменты разработки, которые создают файлы в рабочем каталоге вашего репозитория, вы можете добавить их в .git/info/exclude
, чтобы они случайно не попали в коммит в вашем репозитории.
Глобальные правила игнорирования в Git
Кроме того, для всех репозиториев в локальной системе можно определить глобальные шаблоны игнорирования Git, настроив параметр конфигурации Git core.excludesFile
. Этот файл нужно создать самостоятельно. Если вы не знаете, куда поместить глобальный файл .gitignore
, расположите его в домашнем каталоге (потом его будет легче найти). После создания этого файла необходимо настроить его местоположение с помощью команды git config
:
$ touch ~/.gitignore
$ git config --global core.excludesFile ~/.gitignore
Будьте внимательны при указании глобальных шаблонов игнорирования, поскольку для разных проектов актуальны различные типы файлов. Типичные кандидаты на глобальное игнорирование — это специальные файлы операционной системы (например, .DS_Store
и thumbs.db
) или временные файлы, создаваемые некоторыми инструментами разработки.
Игнорирование ранее закоммиченного файла
Чтобы игнорировать файл, для которого ранее был сделан коммит, необходимо удалить этот файл из репозитория, а затем добавить для него правило в .gitignore
. Используйте команду git rm
с параметром --cached
, чтобы удалить этот файл из репозитория, но оставить его в рабочем каталоге как игнорируемый файл.
$ echo debug.log >> .gitignore
$ git rm --cached debug.log
rm 'debug.log'
$ git commit -m "Start ignoring debug.log"
Опустите опцию --cached
, чтобы удалить файл как из репозитория, так и из локальной файловой системы.
Коммит игнорируемого файла
Можно принудительно сделать коммит игнорируемого файла в репозиторий с помощью команды git add
с параметром -f
(или --force
):
$ cat .gitignore
*.log
$ git add -f debug.log
$ git commit -m "Force adding debug.log"
Этот способ хорош, если у вас задан общий шаблон (например, *.log
), но вы хотите сделать коммит определенного файла. Однако еще лучше в этом случае задать исключение из общего правила:
$ echo !debug.log >> .gitignore
$ cat .gitignore
*.log
!debug.log
$ git add debug.log
$ git commit -m "Adding debug.log"
Этот подход более прозрачен и понятен, если вы работаете в команде.
Скрытие изменений в игнорируем файле
Команда git stash — это мощная функция Git, позволяющая временно отложить и отменить локальные изменения, а позже применить их повторно. По умолчанию команда git stash
ожидаемо не обрабатывает игнорируемые файлы и создает отложенные изменения только для тех файлов, которые отслеживаются Git. Тем не менее вы можете вызвать команду git stash с параметром --all, чтобы создать отложенные изменения также для игнорируемых и неотслеживаемых файлов.
Отладка файлов .gitignore
Если шаблоны .gitignore
сложны или разбиты на множество файлов .gitignore
, бывает непросто отследить, почему игнорируется определенный файл. Используйте команду git check-ignore
с параметром -v
(или --verbose
), чтобы определить, какой шаблон приводит к игнорированию конкретного файла:
$ git check-ignore -v debug.log
.gitignore:3:*.log debug.log
Вывод показывает:
<file containing the pattern> : <line number of the pattern> : <pattern> <file name>
При желании команде git check-ignore
можно передать несколько имен файлов, причем сами имена могут даже не соответствовать файлам, существующим в вашем репозитории.
Поделитесь этой статьей
Следующая тема
Рекомендуемые статьи
Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.