Как правильно настроить .gitignore

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

Предположим, у нас есть дерево проекта. Но в этом дереве много каталогов и файлов, которые не требуется отслеживать. Из серии «изменился, ну и пёс с ним». Как нам сделать так, чтобы git их игнорировал?

На примере WordPress пропишем в файл .gitignore:

wp-admin/*
wp-content/*
wp-includes/*

Все каталоги будут исключены, кроме рутового. Но если добавить строку:

!wp-content/themes/*

То по идее, git должен исключить каталог с темами и отслеживать в нем изменения. Да, он так и поступит. Но! Если вы удалите файл - он его удалит из проекта, а если переименуете или добавите новый файл, то он в проекте не появится, т.к. он попадает под маску: wp-content/*

Это получается надо добавлять все файлы по-отдельности?

Необязательно. Но в некоторых случаях придется. В случае с темами WordPress нужно использовать несколько строк исключения:

wp-content/languages/*
wp-content/plugins/*
wp-content/upgrade/*
wp-content/uploads/*
wp-content/themes/twentytwentytwo/*

Здесь мы исключаем все каталоги, кроме themes и в каталоге themes игнорируем каталог с темой twentytwentytwo. Все остальные каталоги и файлы попадут в проект.

Если говорить о WordPress, то во всех каталогах лежат файлы-заглушки index.php или wp-cron.php и т.п. Чтобы их исключить просто прописываем строки:

index.php
wp-*.php

И все файлы с именами, попадающие под маску будут исключены из проекта, даже в тех каталогах, которые мы не игнорируем.

Как проверить корректность .gitignore

Добавляем новый файл в свой проект. Если git его подхватил, значит все хорошо. А в случае, когда нет, то в консоли запускаем команду: git add /path/path/file.ext и если этот файл попадает под какую-то маску игнорирования, git выдаст предупреждение.

Ну а если вы не часто переименовываете или добавляете новые файлы, то git -f add /path/path/file.ext решит проблему.