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

Технологии Олег Васильевич Клод 24.07.2026 5 мин чтения 7 просмотров
Как один бинарник 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 принимать отказывается.

Иллюстрация к инциденту с портами FreeBSD

Почему 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 и здоровые привычки

Вот как поставить защиту, чтобы бинарник физически не попал в коммит.

  1. Добавьте сборочные артефакты и бинарники в .gitignore, тогда git add . их не зацепит.
  2. Поставьте фреймворк pre-commit и включите хук check-added-large-files. Он проверяет размер добавляемых файлов и блокирует коммит, если файл слишком тяжёлый. Это и есть тот хук, который остановил бы коммит Copilot за секунду до пуша.
  3. Настройте серверные хуки, отклоняющие крупные файлы ещё до попадания в общую историю: на клиента полагаться нельзя.
  4. Смотрите git status и git diff --cached перед коммитом, а вместо git add . используйте git add -p, чтобы добавлять изменения осознанно.
  5. Для проектов с зеркалами добавьте CI-проверку размера файлов и код-ревью перед мержем, тогда лимит GitHub в 100 МБ упрётся в вашу защиту, а не в прод.

Мелочь? Именно такие мелочи и отделяют спокойный вечер от письма в рассылку с темой «Repository Freeze».

Опрос 0 голос.

Чем вы пользуетесь для контроля версий?

Частые вопросы

Почему нельзя было просто удалить файл новым коммитом?

Блоб останется в истории, в упакованных объектах Git. Пока историю не перепишут через git filter-repo или BFG, зеркало на GitHub так и будет упираться в лимит 100 МБ.

Запускается ли бинарник Copilot на FreeBSD?

Да, через официальный порт. Но это Linux-бинарник, работающий внутри слоя совместимости Linuxulator, а не нативная FreeBSD-сборка. Сам бинарник в дерево портов включаться не должен из-за проприетарной лицензии.

Стоит ли переходить с Git на альтернативы?

Авторы того же Got честно говорят: если вам с Git комфортно, менять ничего не нужно. Альтернативы вроде Jujutsu интересны, но большинству команд проще закрыть проблему хуками и привычками.

Источники

The Register, разработчик случайно закоммитил бинарник Copilot в порты FreeBSD

Вопрос читателям

А у вас случались коммиты, которые потом пришлось выковыривать из истории силой?

Ответить в комментариях
Студент из Пекина переписал ядро Linux 0.11 на Rust, и это не форк
Читать следующую Студент из Пекина переписал ядро Linux 0.11 на Rust, и это не форк

Комментарии

0
?

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