Что такое файл .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