EMZETT.
Войти

.gitignore и подмодули Git: исключение файлов и подключение проектов

Коротко: Файл .gitignore определяет, что Git не версионирует; подмодули (submodules) подключают другой репозиторий в фиксированном состоянии к вашему.

Подробнее: Не всё в папке проекта должно находиться под контролем версий: сгенерированные файлы, зависимости, секреты. А иногда нужен чужой или общий код без копирования.

Подробности

.gitignore

.gitignore содержит шаблоны для файлов, которые Git должен пропускать:

node_modules/
dist/
*.log
.env
.DS_Store
!important.log    # исключение с !
/build            # только в главной папке

Комментарии начинаются с #. .gitignore действует только для ещё не отслеживаемых файлов. Если что-то уже было добавлено, оно остаётся отслеживаемым, пока вы не уберёте это из индекса командой git rm --cached file. Файлы для конкретных папок могут лежать в подпапках; глобальные правила лежат в ~/.config/git/ignore. Шаблоны для многих языков предлагают gitignore.io и репозиторий github/gitignore.

Секреты

Пароли, API-ключи и файлы .env никогда не должны попадать в репозиторий. Однажды добавленный секрет остаётся в истории и должен считаться скомпрометированным: немедленно отзовите и обновите ключи; удаление из истории (git filter-repo) трудоёмко. Лучше положить .env.example без значений.

Подмодули

Подмодуль — это ссылка на конкретный коммит другого репозитория:

git submodule add https://github.com/company/library libs/library
git clone --recurse-submodules <url>       # клонировать с подмодулями
git submodule update --init --recursive    # загрузить потом
git submodule update --remote              # перейти на более новое состояние

Файл .gitmodules хранит путь и адрес. Главный проект запоминает точный коммит, так что все используют одно и то же состояние.

Когда подмодули, когда альтернативы

Подмодули пригодны, но чреваты ошибками: их забывают обновлять или отправляют изменения только в главный проект. Часто проще менеджеры пакетов (npm, pip, Maven) или монорепозиторий. Вариант — поддеревья (subtrees) (git subtree), которые копируют код вместо ссылки на него.

См. также: Git, Переменные окружения, Монорепозиторий, API-ключи