Классический подход и его проблемы
В работе с Git часто случается: делаешь коммиты, и вдруг понимаешь, что туда попали .DS_Store файлы, node_modules, IDE конфигурация или другой мусор (например, CLAUDE.md), который не должен быть в репозитории. Ещё хуже, если туда просочились переменные окружения. Потом идёт неловкая очистка: добавление этих файлов в .gitignore, удаление их из истории репозитория и надежда, что никто это не заметил.
Противоположная стратегия
Что если перевернуть этот подход? Вместо того чтобы разрешить всё по умолчанию и селективно игнорировать файлы, игнорировать всё по умолчанию и только явно разрешить конкретные файлы?
Вот как это может выглядеть на практике для простого Go проекта:
*
!.gitignore
!*.go
!README.md
!go.mod
!go.sum
Этот файл .gitignore делает ровно то, что нужно:
*— игнорировать всё
Но вот эти файлы — нет:
!.gitignore— сам файл gitignore!*.go— Go исходники!go.mod— файл модуля Go!go.sum— файл зависимостей Go- и всё остальное, что ты хочешь добавить
С таким подходом в Git будут отслеживаться только те файлы, которые ты явно разрешил. Никаких случайных коммитов случайного мусора.
Когда это имеет смысл
Эта техника подходит не для каждого репозитория и не для каждого разработчика, но это хороший альтернативный подход для изучения. В наши дни в проектах локально лежит столько всякого барахла — агентские документы, всякие подпапки, — что иногда проще просто с самого начала игнорировать всё.
Посмотри только на этот .gitignore из typescript-go — целых 207 строк.
Полезные команды
Если хочешь проверить, игнорируется ли путь Git, запусти команду:
git check-ignore -v internal/server/server.go
Это может спасти много времени на изучение головоломок, когда файл, который ты ожидал отслеживать, не появляется в Git.
P.S. Слышал ли ты про lazygit? Лучший Git TUI на свете, обязательно посмотри.