haiodo.blog
Ретроспектива: 10k коммитов x2

Ретроспектива: 10k коммитов x2

GitHub насчитал 10 542 коммита, а я насчитал примерно столько же: за ~20 лет в публичных репозиториях и закрытых, которые у меня сохранились, 10 173 уникальных коммитов, и это видимая часть моей работы; разбираю, откуда разница, из каких проектов и лет они складываются и как повторить подсчёт на своих репозиториях.

Откуда 10k


Мой подсчёт ниже описывает только видимую часть моей работы, в некоторые промежутки моей жизни, на управленческих должностях я писал меньше, но не в разы, верхушка айсберга публичные репозитории, и закрытие которые у меня сохранились, глупо было не записать, но честно удалял все когда проект закрывался. Так что большая часть закрытой работы сюда не попала. Что про неё можно сказать - в подразделе “Что под водой” в конце раздела.

GitHub насчитал мне 10 542 коммита. Круглые 10k оказались правдой, но это не 10k GitHub: он считает платформу трижды, а DLTK времён CVS и закрытых репозиториев не видит. Я посчитал каждый коммит один раз, вместе с историей, которая у меня сохранилась, и получил 10 173. И это только вершинка :-)

У меня можно сказать настал момент когда хочется оглянуться назад, подбить текущее состоянии, возможно найти новое место под солнцем, так что открыт для любых предложений, но стало вдруг интересно а как я могу выглядеть со стороны, мне чуток повезло, у меня достаточно много следов который можно найти в интернете, я не писал блогов до этого, так что они в основном заключены в открытых репозиториях доступных на Github. Другие площадки были, но в меньшей степени.

Первое - платформа. Её копии лежат в трёх репозиториях: intabia-fusion/platform, Platform-Collective/platform и hcengineering/platform, и GitHub считает мои коммиты в каждом из них отдельно: это почти две трети его числа.

Клерк считает одну стопку бумаг, а три зеркала за ним показывают её трижды

В 2021-2024 годах три копии дают одинаковые числа, а в 2022-2024 почти весь счётчик GitHub - это они. С 2025 года числа расходятся.

Коммиты: GitHub и уникальныеGitHub насчитал 10 542 коммита, без трёх копий платформы 3 609; уникальных коммитов в репозиториях 10 173.GitHub: коммиты в профилекаждая из трёх копий платформы считается отдельно10 542GitHub без трёх копий платформыминус 6 933 коммита (65,8 %)3 609Уникальные коммиты в репозиторияхбез слияний и дублей, из них 76 - переносы и массовые правки10 173

На графике: коммиты по данным GitHub, они же без трёх копий платформы и уникальные коммиты в репозиториях.

Второе - то, чего GitHub не видит. Его выгрузка начинается с 2010 года, с года создания аккаунта, поэтому годы DLTK, 2006-2009, в его числе не участвуют совсем, а закрытых репозиториев в нём нет. А начал я с 2002 года, тогда еще студентом, и тогда про github еще не кто и не слышал.

Есть и другие расхождения. rcptt лежит в двух репозиториях, а huly.net, huly.core, huly.server и huly.communication содержат часть тех же коммитов, попытки из монорепы сделать отдельные проекты не удалась :-), что и platform: GitHub считает их отдельно, я нет. Остальное по причинам я не раскладывал.

Что под водой

Работа делится на две части: то, что измерено, и то, чего нет.

Инженер с фонарём и робот смотрят с лодки на подводную часть айсберга со старыми компьютерами

1. Измерено. Публичные репозитории и закрытые, которые у меня сохранились: всё, что посчитано в этом посте.

2. Чего нет. Остальная закрытая работа. Я её вел, но репозиториев не осталось, честный был, и статистику не записал, а так было бы интересно, и сколько её было, я уже не помню. Яснее всего это видно в 2010-2018 годах: публичная история в эти годы затихает.

Показать эту работу можно только оценкой: это штриховка на графике коммитов по годам, для 2010-2020 годов в сумме около 3,7 тыс. коммитов сверх видимых. Оценка доводит каждый год до среднего числа коммитов в годы, когда я полный день работал над проектом с видимой историей, - в 2007-2009 и в 2021-2024. С 2013 года я отвечал за архитектуру линейки продуктов и вёл несколько команд, поэтому для 2013-2020 такая оценка, скорее всего, завышает число моих коммитов и годится только как верхняя граница. Я понимаю что это пальцем в небо, но что есть :-)


Двадцать лет по проектам

Проекты по годам12 строк: проекты и группы репозиториев, с 2006 по 2026 год.2006200620082008201020102012201220142014201620162018201820202020202220222024202420262026rcpml54DLTK (3 репозитория)1 740ecl95f4138утилиты, эксперименты и прочее (24 репозитория)406закрытые проекты3 748yang-ide57rcptt138tenniarb389networkservicemesh (14 репозиториев)178platform (8 репозиториев)2 895форк intabia-fusiongowt335Справа - коммиты, переносы включены. Полоса: от первого до последнего коммита.В группах - репозитории, где есть коммиты автора.

На графике каждая строка - проект или группа репозиториев: полоса идёт от первого до последнего коммита, справа число коммитов, переносы включены.

Двадцать лет я разбил на пять периодов по годам. Границы - там, где меняется число коммитов в год или набор проектов.

2006-2009. Это время в Xored Software: с 2005 по 2013 год я был там Sr. Software Engineer, а с 2013-го - Principal Software Engineer. Здесь начинаются rcpml (2006-2007) и Eclipse DLTK, IDE для TCL, Ruby и JavaScript: с 2007 года это три репозитория. Почти все коммиты этих четырёх лет - DLTK. История DLTK тех лет велась на CVS и лежит в git.

2010-2018. Главная работа этих лет - закрытая: продукты Q7, Q7 Server и InterSystems Atelier и проекты заказчиков.

Публичного осталось немного: ecl (2010-2013), f4, IDE для Fantom (2010-2016), yang-ide на EMF и GEF/GMF (2014-2015) и rcptt (2015-2020) - это Q7 после переноса в open source. С 2017 года появляется tenniarb, с конца 2018-го - networkservicemesh, группа репозиториев.

2019-2021. Коммитов снова становится больше. Заканчивается rcptt (2020), networkservicemesh идёт до 2021 года, tenniarb продолжается, а в 2020 году появляется platform-0.2, за ним platform-0.4 и с ноября 2021 года platform: три репозитория идут встык, каждый следующий начинается через несколько дней после последнего коммита предыдущего. Разные версии это подходы к платформе на разных техлоногиях, ну и в голову со-основателю этого проекта оно не влазило когда я начинал работать :-) И он начинал по новой.

2022-2024. platform, плюс сохранившиеся закрытые проекты, что не требовали жесткого NDA. Коммитов с каждым годом больше.

2025-2026. К platform добавляются вспомогательные репозитории (с октября 2025-го), на его строке отмечен форк intabia-fusion (ноябрь 2025-го), а с сентября 2026-го - gowt- это уже мои ИИ эксперементы, до чего не когда не доходили руки, о них в следующих статьях :-)

Мелкие репозитории из разных лет собраны в одну строку графика: “утилиты, эксперименты и прочее”. Сохранившиеся закрытые репозитории - строка “закрытые проекты”, она идёт с 2011 года.


Коммиты по годам

Коммиты по годамКоммитов по годам с 2006 по 2026: всего 10 173, больше всего в 2026 году (2 632); переносы и массовые правки включены. Штрихованная часть столбцов 2010-2020 - оценка, не измерение: она доводит год до среднего при полной занятости (557 в год), всего 3 726 коммитов в закрытых репозиториях.коммитыоценка: закрытые репозитории01 0002 0003 000среднее при полной занятости: 5572 6321 19876453452438037634620062008201020122014201620182020202220242026Коммиты без слияний и дублей, переносы включены. 2026 - данные по 19 октябряШтриховка - оценка: среднее при полной занятости минус видимые коммиты года.В CVS-проектах сообщение, повторённое за 10 минут, - один коммит.

На графике: число коммитов по годам с 2006 по 2026, без слияний и дублей, переносы включены; штриховка у столбцов 2010-2020 - оценка скрытых коммитов, а не измерение.

Первая волна - годы DLTK: три года с 2007-го по 2009-й дали около шестой части всех коммитов, вообще мы его начали чуть раньше, он в закрытом режиме для Cisco, и только чуть позже он полетел в открытое поле, я был юн, работали по 14-16 часов так что не удивительно.

Потом затишье: с 2010 по 2018 год публичных коммитов в год примерно в семь раз меньше, чем в 2007-2009. Эти годы я в основном вёл закрытую разработку для разных клиентов, Cisco/British Telecom и тд. Столбцы 2011-2017 выше публичной истории: в них вошли сохранившиеся закрытые репозитории.

С 2019 года кривая в целом идёт вверх. Рекорд - 2026 год, 2 632 коммита к 19 октября; второй результат у 2025-го, третий у 2024-го. Больше половины года дали закрытые проекты и gowt, которому меньше месяца. Я думаю все уже заметили что мир разработки меняется, но мне пока не понятно стало ли лучше, но что все стало “конкретно” по другому я думаю уже все заметили.

Размер коммита по годамМедиана размера рабочего коммита (добавлено плюс удалено строк кода) по годам с 2006 по 2026, от 6 до 141 строк в годах, где коммитов не меньше 20; полоса - от 25-го до 75-го процентиля, шкала логарифмическая.строк кода, логарифмическая шкала1101001 00093141620062008201020122014201620182020202220242026Строк кода в рабочем коммите, без генерации и переносов. Полоса - p25-p75.Полый маркер - меньше 20 коммитов в году. 2026 - данные по 19 октября

На графике: медиана размера коммита (добавлено плюс удалено строк кода) по годам и полоса от 25-го до 75-го процентиля, шкала логарифмическая.

Типичный коммит всегда небольшой: медиана ни в одном году не выше 141 строки, а в 2023-2025 годах она вернулась к уровню годов DLTK, нескольким десяткам строк. Годы лучше сравнивать осторожно: размер коммита зависит от эпохи.


Строки кода по кварталам

Строки кода по кварталамДобавлено 3 183 894 и удалено 1 098 169 строк кода с 2006 по 2026 год, по кварталам, со скользящим средним за 4 квартала. Шкала логарифмическая: у квартала меньше 100 строк столбца нет. Отдельно переносы и массовые правки: 1 122 089 добавлено и 255 211 удалено.добавленоудаленосреднее за 4 кварталастрок1001 тыс.10 тыс.100 тыс.1 млн1 тыс.10 тыс.100 тыс.1 млнпереносы и массовые правкив строки кода не входят1001 тыс.10 тыс.100 тыс.1 млн1 тыс.10 тыс.100 тыс.2006200820102012201420162018202020222024202620062008201020122014201620182020202220242026Код без генерации и lock-файлов. 2026 - данные по 19 октябряШкала логарифмическая: квартал меньше 100 строк без столбца

На графике сверху строки кода, добавленные и удалённые по кварталам, со средним за четыре квартала, шкала логарифмическая; снизу отдельным рядом переносы и массовые правки, в строки кода они не входят.

За двадцать лет в видимой части добавлено 3,18 млн строк кода. Больше половины этого - один 2026 год, 1,67 млн.

Самый высокий столбец - третий квартал 2026-го, а до последнего квартала 2025 года самый большой квартал давал около 60 тыс. строк.

Самый высокий столбец нижней панели - первый квартал 2007 года: первичные загрузки исходников DLTK в dltk.core и dltk.tcl.


Итог

Эти числа - только видимая часть: публичные репозитории и пара текущих закрытых, которые у меня есть.

Круглые 10k оказались правдой, но не теми, что насчитал GitHub. Между волной DLTK в 2007-2009 годах и рекордом 2026-го лежат девять лет закрытой разработки.

Что я для себя забрал из этого опуса, нужно записывать статистику своей работы, чтобы можно было более детально потом как я посмотреть а чего это такого я делал тогда 20цать лет назад. Мне повезло, и я смог нарыть, а кто то все время на закрытых разработках.


Как повторить на себе

Робот у сортировочной машины разбирает поток бумажных лент

Проще всего отдать этот навык своему кодовому агенту, Claude Code, Codex или похожему: он найдёт ваши репозитории, попросит подтвердить, какие имена и почты ваши и что можно называть, и запустит скрипты. Тем, кто хочет сделать это руками, шаги ниже.

Скрипты лежат в этом блоге: scripts/commits. Нужны Node.js 20 или новее, git и gh. collect.mjs выгружает коммиты, github.mjs берёт числа GitHub (сумму totalCommitContributions по годам из GraphQL API), charts.mjs рисует графики, правила описаны в README.md рядом.

Что править. В самих скриптах личных данных нет. Скопируйте шаблон scripts/commits/config.example.mjs в $COMMITS_DATA_DIR/config.mjs, по умолчанию это not-shared/commit-stats/config.mjs (в этом блоге папка в .gitignore), и поправьте в нём GITHUB_LOGIN, AUTHOR (имена и почты), REPOS_DEFAULT (куда клонировать), PROJECTS (функция ({ gh, local, privateProjects }) => [...]: проекты в порядке “апстрим раньше форков”, с опциями moves, group, cvs и checkouts), COPIES (копии одной истории на GitHub, чтобы вычесть повтор), GROUPS и MARKS (подписи и метки на графике проектов), ESTIMATE (эпохи полной занятости и скрытые годы) и GENERATED_FILES (ваши правила генерации). PRIVATE_LABEL и PRIVATE_SUBJECT (название строки закрытых проектов и тема их коммитов) можно не задавать. Без config.mjs скрипты collect.mjs, github.mjs и charts.mjs останавливаются с кодом 1 и пишут, где ждут файл и где лежит шаблон.

Закрытые репозитории. Их описание лежит в $COMMITS_DATA_DIR/private-repos.mjs, а в графики попадает только имя “закрытые проекты”. Выгрузка raw/, commits.csv и JSON-файлы лежат в той же папке.

Команды.

export COMMITS_REPOS_DIR=~/repos               # куда клонировать, если не подходит REPOS_DEFAULT
node scripts/commits/collect.mjs               # клоны и commits.csv
node scripts/commits/collect.mjs --big         # крупные коммиты: импорты и переносы
node scripts/commits/collect.mjs --reuse-raw   # пересчёт после правки moves
node scripts/commits/github.mjs
node scripts/commits/charts.mjs

Автор и ветки. Коммит мой, если имя или почта автора есть в AUTHOR. Берутся все ветки, кроме refs/stash: stash - это merge-коммит под моим именем, а не история. Для platform берутся только develop и ветка, на которой я работал в момент выгрузки.

Слияния и дубли. Слияния (1 341) коммитами не считаются. Дубль (1 638) - коммит, который уже учтён: внутри проекта это та же тема, те же числа строк и то же время автора, между проектами - тот же SHA или то же время автора и та же тема. Он считается один раз, в проекте, который стоит в списке раньше.

CVS. В старой истории CVS число коммитов раздуто: клиент CVS в Eclipse коммитит каждый плагин отдельно, а конвертер в git добавляет служебные коммиты. Поэтому в CVS-проектах подряд идущие коммиты с одной темой в окне 10 минут сворачиваются в один, так свёрнуты 1 372 коммита. Служебные коммиты конвертера выбрасываются, коммиты, которые лишь сообщают о слиянии ветки, считаются слияниями. Дубли там ищутся без времени автора: конвертер его не сохраняет.

Переносы. Перенос - коммит, который приносит уже существующий код: первичная загрузка, вендорное обновление, перенос между репозиториями, массовое переименование, смена версии или заголовков лицензий. Кандидатов показывает collect.mjs --big, это коммиты от 15 000 строк кода или от 500 файлов. Откройте коммит через git show --stat: если тема и список файлов показывают, что код уже существовал, хеш идёт в moves проекта с причиной в одну строку, а большой коммит с новым кодом остаётся обычным. Перенос входит в число коммитов, но его строки написаны раньше или в другом месте, поэтому к строкам кода они не прибавляются.

Строки. По пути файла строки делятся на lock-файлы, генерацию (сюда же вендорный код и тестовые данные) и код. В график идёт только код.

Оценка. Среднее эпохи - все видимые коммиты в год по её годам. A - среднее двух эпох, сейчас около 557 коммитов в год. Оценка года - A минус видимые коммиты этого года, но не меньше нуля, итог - сумма по скрытым годам. 2025 в эпохи не входит: год резко выше остальных, а без него обе эпохи сходятся в пределах 1%.

Пределы. Число коммитов CVS зависит от окна свёртки, а коммитер в CVS не всегда автор: чужие патчи опознаются по теме и помечаются вручную. Размер коммита зависит от эпохи. Оценка - верхняя граница, а не измерение.