TGViewer
Между инцидентами Между инцидентами @davydovpage · 81 subscribers
Post #85 120
Что такое git patch и как выстрелить им себе в ногу

Вероятно, если вы ни разу не сталкивались с процессом применения изменений в опенсурс-разработке, то вы и никогда не сталкивались и с git patch. Собственно, что такое этот git patch? Вкратце, это специальный формат текстового файла, который отображает изменения в коде между двумя коммитами. Например, изменения, внесённые разрабом относительно ветки master. Зачем это нужно, когда есть git merge, пул реквесты и т. д.? Ну... Не знаю, насколько это хорошая практика, но много опенсурсных проектов (в частности, Linux) принимают от контрибьюторов изменения по почте 😊. В некоторых случаях это из-за их олдовости, а в других, я полагаю, это единственный доступный способ для владельцев репозитория работать с контрибьюторами. Но так или иначе, git patch'и идеально подходят для того, чтобы их отправлять по мылу. Выглядят они как-то так.

Теперь к нашей истории. Как видно из примера патча сверху, в него входит также и описание патча. И недавно произошёл один забавный случай, связанный как раз с этим описанием. Некий Орестис Флорос завёл в гитхабе пулреквест для i3 (оконный менеджер). Меинтейнер принял его и в виде гит патча забрал себе для того, чтобы вставить в другой репозиторий и сформировать debian пакет приложения. После того, как он применил патч, он заметил, что некоторые операции в приложении теперь занимают на несколько секунд дольше.

Дебаг показал, что помимо валидных изменений, которые и должны были примениться после патча, были применены также изменения, которые были в описании патча. А в описании было что-то типа: «Эти изменения я протестил так» и git diff изменений, которые автор вносил для тестирования своих правок, и в которых как раз был sleep(1), из-за которого в некоторых местах и появлялись непонятные паузы.

То есть ещё раз. Были применены изменения, которых не было в коммитах пулреквеста (!), но которые были в его описании и имели формат git diff. Дело в том, что в патче любой текст формата git diff будет рассматриваться как валидные изменения и будет применён. И не важно, в какой последовательности будут идти дифы и обычный текст, который будет принят за обычные комментарии.
  • 🤔 3
More from @davydovpage
  1. Mar 10, 2026WSL Manager: тула для управления wsl-инстансами Нашёл полезный инструмент для тех, кто всё…
  2. Mar 8, 2026Селф-хилинг в XFS Новая серия патчей в Linux для XFS добавила возможность мониторинга здор…
  3. Mar 5, 2026Готовится новая фича дополнительных CPU планировщиков в Linux Эта фича касается sched_ext…
  4. Mar 3, 2026«Проблема» протокола NTP и что такое NTS Кто ни разу не слышал про NTP, этот протокол опис…
  5. Mar 2, 2026Из разряда «современные проблемы требуют современных решений» Команда GNOME столкнулась со…
  6. Feb 28, 2026Забавная старая задачка с собеседований Что будешь делать если случайно выполнишь "chmod 4…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →