Поиск по сайту:

Что такое файл .gitignore и как его настроить?


Файл .gitignore — это текстовый файл, помещенный в ваш репозиторий git, который сообщает git не отслеживать определенные файлы и папки, которые вы не хотите загружать в ваш главный репозиторий. У него много применений, и вам почти всегда нужно будет настраивать его, если вы настраиваете новый репозиторий.

В чем смысл .gitignore?

В большинстве проектов существует разница между кодом/конфигурацией и генерируемыми файлами из этого кода или конфигурации. Последнее, как правило, бесполезно и обычно может быть проигнорировано.

Обычно вы хотите, чтобы код и конфигурация отслеживались только через git. Это связано с тем, что сгенерированные файлы являются эфемерными, и если вы их удалите, вы можете просто создать их снова. Часто нет смысла загружать их, так как они просто усложнят ситуацию и вызовут ненужные конфликты слияния.

Это широкое определение, поэтому давайте рассмотрим пример. В проектах Node JS есть папка с именем node_modules, содержащая все внешние пакеты, необходимые для запуска вашего кода. Вы можете удалить этот каталог и полностью перестроить его, запустив npm install, который использует конфигурацию package.json для поиска пакетов.

Так какой смысл иметь папку node_modules в Git? На самом деле его нет, так как он более сложный, может вызвать проблемы и во многих случаях даже значительно увеличить размер репозитория Git.

Если вы проигнорируете весь каталог, все ваши коллеги все равно смогут создать свою собственную локальную копию из файла package.json . Поэтому вместо этого в Git следует отслеживать только package.json. Большинство вещей, которые добавляются в .gitignore, следуют этому шаблону. Артефакты сборки, такие как папка ./bin/, не фиксируются, поскольку являются прямым результатом самого кода.

Для удобства в .gitignore можно добавить и другие вещи. MacOS создает системные файлы с именем .DS_store, которые вы всегда можете игнорировать. Возможно, вы храните в .env/ ключи API, которые вы не хотите отслеживать в системе контроля версий, вы также можете добавить их. Кэши, журналы и другие выходные данные обычно можно игнорировать.

Использование .gitignore

Вам нужно будет создать файл с именем .gitignore без расширений в корне вашего проекта, где находится ваш каталог .git. Вы можете сделать это из своего файлового браузера или из командной строки в любом текстовом редакторе CLI:

nano .gitignore

Вы можете настроить это разными способами, но основными инструментами, которые у вас есть, являются:

  • * подстановочные знаки, которые соответствуют любому тексту и могут использоваться для сопоставления с любым каталогом или любым файлом независимо от расширения.
  • !, который работает как своего рода белый список, который отменяет ранее исключенный файл. Основная проблема заключается в том, что он добавляет в белый список файл, только если он был напрямую исключен, и не будет работать с файлами в каталогах, которые были полностью исключены.
  • **, который рекурсивно сопоставляет что угодно с каталогами. Например, **/*.json соответствует любому файлу JSON независимо от того, где он находится, а src/** будет рекурсивно соответствовать каждому файлу в папке. Это полезно, если вы хотите внести в белый список, а не игнорировать весь каталог.

Например, gitignore Node JS может выглядеть следующим образом:

node_modules/
build/
npm-debug.log
.env
.env.test
.env.production
.DS_Store
.npm
.eslintcache
logs/
*.log
npm-debug.log*

Добавление файлов в белый список с помощью ! может быть очень полезным для многих конфигураций. Например, в одном из моих проектов у меня был инструмент под названием steamcmd , который загружает зависимости для игровых серверов из Steam. Этот инструмент упакован в один переносимый исполняемый файл, но он производит много мусора, который я не хочу отслеживать в Git.

Решение состояло в том, чтобы игнорировать все в папке, но внести исполняемый файл в белый список. Это будет работать для любого переносимого исполняемого файла, который расширяется таким образом или создает ненужный мусор в каталоге.

Project/steamcmd/**
!Project/steamcmd/steamcmd.exe

gitignore также использует некоторые другие шаблоны подстановки Unix для сопоставления строк, такие как вопросительный знак для сопоставления одного символа или [a-z] , которые будут соответствовать наборам символов.

Вы также можете написать несколько файлов .gitignore , которые могут сопоставлять файлы друг с другом. Это не слишком полезно, так как вы можете просто включить правила в корневой файл, который легче отслеживать, но в некоторых случаях это может помочь с повторением кода. Однако обходным путем является использование наборов символов для соответствия нескольким каталогам. Например, сопоставление каталогов в верхнем и нижнем регистре с набором:

# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/

Если у вас возникли проблемы с конфигурацией .gitignore , вы можете отладить ее с помощью команды check-ignore Git:

git check-ignore -v testfile.json

Глобальный .gitignore

В Git также есть глобальная настройка для .gitignore, но в большинстве случаев ее не следует использовать. Это связано с тем, что глобальный .gitignore на вашем компьютере не применяется к вашим коллегам, а только к коммитам, сделанным с помощью вашего экземпляра Git.

Если вы все равно хотите установить его, вы можете сделать это с помощью следующей команды:

git config --global core.excludesfile ~/.globalignore

Принудительная фиксация или сохранение игнорируемых файлов

Принудительная фиксация, как правило, плохая идея — вам, вероятно, следует добавить белый список для этого конкретного файла, потому что после фиксации обновления этого файла не будут отслеживаться. Но если вы хотите что-то зафиксировать вручную, вы можете запустить git add с параметром --force :

git add -f debug.log

Точно так же git stash также может скрывать локальные изменения в игнорируемых файлах, что на самом деле может быть полезно, поскольку это не повлияет на удаленное хранилище:

git stash --all