Как один бинарник Copilot заморозил порты FreeBSD, и что это говорит о Git

21 июля 2026 проект FreeBSD заморозил свой репозиторий портов из-за одного коммита: разработчик по ошибке отправил в дерево портов бинарник Microsoft Copilot. Этот бинарник весил больше 100 МБ, упёрся в жёсткий лимит GitHub и порвал автоматическое зеркалирование, а заодно затащил в историю репозитория, по формулировке разработчика FreeBSD Кайла Эванса, «блоб сомнительного лицензирования». Ниже разберём, почему такую ошибку в Git нельзя починить коммитом «удалил и забыл», и покажем хук, который останавливает подобный коммит за секунду до пуша.
Один коммит с бинарником Copilot, и зеркало портов FreeBSD сломалось
Анонс «2026 Ports Repository Freeze» вышел в рассылке freebsd-announce 21 июля и действовал ещё и на следующий день. Причина в письме сформулирована прямо:
«Данный коммит разорвал зеркалирование нашего дерева портов на github.com из-за их жёсткого лимита на размер файла в 100 МБ и внёс в историю репозитория блоб сомнительного лицензирования».
Дерево портов FreeBSD, это большая коллекция рецептов сборки стороннего софта. Несколько лет назад проект переехал с Subversion на Git и держит на GitHub зеркало в режиме «только чтение». Зеркало синхронизируется автоматически, пока кто-нибудь не запушит файл, который GitHub принимать отказывается.

Почему GitHub говорит «нет» файлам тяжелее 100 МБ
Лимит прописан в документации GitHub дословно: «GitHub блокирует файлы больше 100 МиБ». Это хардблок на стороне сервиса. Бинарник Copilot CLI под него не пролез, поэтому push на зеркало отбивался, и синхронизация вставала.
Здесь и кроется засада, из-за которой FreeBSD пришлось замораживать порты вместо быстрого фикса. Даже если удалить злополучный файл новым коммитом, сам блоб остаётся в истории, внутри упакованных объектов Git (packfiles). Для Git это не мусор, а часть неизменяемой цепочки. Пока историю не перепишут, зеркало на GitHub будет упираться в лимит снова и снова. Отсюда и заморозка: нужна хирургия истории, а её нельзя делать, пока в дерево валятся новые коммиты.
«Порт» ≠ нативная версия: при чём тут Linuxulator и чужая лицензия
Деталь, которую легко упустить: официальный порт Copilot во FreeBSD уже существует. Только слово «порт» тут обманчиво. Это не нативная сборка под FreeBSD, а пакет, который запускает Linux-бинарник Copilot внутри слоя совместимости Linuxulator, механизма для запуска линуксовых приложений на FreeBSD.
Сам бинарник Copilot CLI в этот пакет попадать не должен. Он распространяется под собственной кастомной лицензией Microsoft, и его место не в дереве портов. Поэтому Эванс и назвал попавший в историю блоб «сомнительно лицензированным»: проблема техническая (размер) и юридическая сразу, чужой проприетарный файл лежит в открытом репозитории.
Блоб, который не удалить: как чистят историю Git
Чтобы вычистить большой или проприетарный объект из истории, git rm не хватит. Нужны инструменты переписывания истории. git filter-repo, современный рекомендуемый способ выпилить конкретный файл или блоб из всех коммитов. BFG Repo-Cleaner проще и заточен на удаление крупных файлов и секретов.
Минус у обоих один и болезненный для больших проектов: переписывание общей истории ломает клоны у всех участников. После такой операции хеши коммитов меняются, и каждому приходится заново клонировать или ребейзить. Для дерева портов FreeBSD с сотнями контрибьюторов это не рутина, а событие, отсюда и официальный анонс с заморозкой.
Если большой файл нужен легитимно, для этого есть Git LFS (Large File Storage): он выносит тяжёлые блобы за пределы обычной истории и подставляет вместо них лёгкие указатели. Но Copilot-бинарнику в дереве портов не место ни в истории, ни в LFS.
Git, это не аббревиатура: почему с ним так тяжело
Инцидент напомнил старую истину: Git сложен. Название, к слову, не аббревиатура. В британском английском «git» означает «неприятный тип», и Линус Торвальдс выбрал слово не случайно. Сам Git описывает себя как систему, «созданную, чтобы справляться со всем, от малых до очень больших проектов, быстро и эффективно». Гибкость колоссальная, но именно она превращает простую ошибку вроде лишнего git add . в многодневную заморозку целого репозитория. А рядом живёт целая семья альтернатив, которые пытаются сделать контроль версий человечнее.
| Инструмент | Идея | Статус |
|---|---|---|
| Game of Trees (Got) | Из мира OpenBSD; «простота и удобство важнее гибкости» | Версия 0.127 вышла ~20 июля 2026, активно развивается |
| Jujutsu (jj) | Git-совместимая; рабочая копия как коммит, автоматический ребейз, «first-class» конфликты | Молодая, активно развивается при участии инженеров Google |
| Gitless | Упрощённая модель поверх Git без индекса | Развитие, судя по всему, заглохло |
| Mercurial, Fossil, Pijul, Sapling | Разные подходы: от встроенного баг-трекера (Fossil) до патч-ориентированной модели на Rust (Pijul) | Существуют параллельно Git |
Показательна честность авторов Got. В их FAQ на вопрос «Стремится ли Got заменить Git?» отвечают: «Нет. Got не стремится заменить Git… Если вы уже используете Git и довольны им, Got вам не нужен». А в разделе о смысле проекта добавляют: «Если вы вообще не понимаете, зачем Got существует, можете просто его игнорировать». Для новичков в Jujutsu автор The Register советует руководство «Jujutsu for Everyone» Ремо Сенековича.
Как не закоммитить лишний бинарник Copilot: хуки, LFS и здоровые привычки
Вот как поставить защиту, чтобы бинарник физически не попал в коммит.
- Добавьте сборочные артефакты и бинарники в
.gitignore, тогдаgit add .их не зацепит. - Поставьте фреймворк pre-commit и включите хук check-added-large-files. Он проверяет размер добавляемых файлов и блокирует коммит, если файл слишком тяжёлый. Это и есть тот хук, который остановил бы коммит Copilot за секунду до пуша.
- Настройте серверные хуки, отклоняющие крупные файлы ещё до попадания в общую историю: на клиента полагаться нельзя.
- Смотрите
git statusиgit diff --cachedперед коммитом, а вместоgit add .используйтеgit add -p, чтобы добавлять изменения осознанно. - Для проектов с зеркалами добавьте CI-проверку размера файлов и код-ревью перед мержем, тогда лимит GitHub в 100 МБ упрётся в вашу защиту, а не в прод.
Мелочь? Именно такие мелочи и отделяют спокойный вечер от письма в рассылку с темой «Repository Freeze».
Чем вы пользуетесь для контроля версий?
Частые вопросы
Почему нельзя было просто удалить файл новым коммитом?
Блоб останется в истории, в упакованных объектах Git. Пока историю не перепишут через git filter-repo или BFG, зеркало на GitHub так и будет упираться в лимит 100 МБ.
Запускается ли бинарник Copilot на FreeBSD?
Да, через официальный порт. Но это Linux-бинарник, работающий внутри слоя совместимости Linuxulator, а не нативная FreeBSD-сборка. Сам бинарник в дерево портов включаться не должен из-за проприетарной лицензии.
Стоит ли переходить с Git на альтернативы?
Авторы того же Got честно говорят: если вам с Git комфортно, менять ничего не нужно. Альтернативы вроде Jujutsu интересны, но большинству команд проще закрыть проблему хуками и привычками.
Источники
The Register, разработчик случайно закоммитил бинарник Copilot в порты FreeBSD
А у вас случались коммиты, которые потом пришлось выковыривать из истории силой?
Ответить в комментариях



Пока нет комментариев. Будьте первым!