Классический подход и его проблемы

В работе с 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 на свете, обязательно посмотри.