Получаем статистику по git-репозиторию в разрезе разработчиков
Итак! Представим, что наступил момент, когда разработка через исходный код реализована на предприятии в полном объеме. Мы разрабатываем в EDT или конфигураторе (но выгружаем конфигурацию в исходный код), версионируем внешние отчеты и обработки и расширения, собираем релизы, проверяем код статическим анализом, в разработке царит гармония и мир. Красота!
Но менеджерам этого мало, всегда хочется чего-то еще, и вот мне прилетает задача — дай статистику по вкладу в код каждого разработчика.
- Описание
- Подробнее
Описание
Введение
Итак! Представим, что наступил момент, когда разработка через исходный код реализована на предприятии в полном объеме. Мы разрабатываем в EDT или конфигураторе (но выгружаем конфигурацию в исходный код), версионируем внешние отчеты и обработки и расширения, собираем релизы, проверяем код статическим анализом, в разработке царит гармония и мир. Красота!
Но менеджерам этого мало, всегда хочется чего-то еще, и вот мне прилетает задача — дай статистику по вкладу в код каждого разработчика.
Задача решаема — есть исходный код, есть репо с историей, значит ничто не может помешать получить нужную информацию.
Сразу скажу, что в эта статья посвящена только техническому аспекту получения статистики работы программистов. Моральную сторону не рассматриваю, считаю, что оценивать разработчика по количеству строк кода непродуктивно и вообще опасно. Статистика работы программиста может использоваться только как один из параметров, не самый главный!
Поиск по ключевым словам git+stat на github дал множество репозиториев с программами на разных языках, помогающих оформить профиль, специализированных на github, среди которых почти затерялся репо git-quick-stats.
Предоставлю слово великолепному README.md этого репо (перевод мой):
git-quick-stats — это простой и эффективный способ доступа к различной статистике в репозитории git.
Любой репозиторий git может содержать массу информации о коммитах, участниках и файлах. Извлечение этой информации не всегда просто, в основном потому, что существует огромное количество опций для огромного количества команд git — не думаю, что есть хоть один человек, который знает их все. Наверное, даже сам Линус Торвальдс не знает их:)
Давайте посмотрим, как выглядит статистика, получаемая git-quick-stats. Для получения этих картинок я обработал репозиторий самого этого приложения git-quick-stats.


Интересно, правда?
Этот инструмент представляет из себя исполняемый sh-скрипт, использующий набор линуксовых утилит:
- awk
- basename
- cat
- column
- echo
- git
- grep
- head
- printf
- seq
- sort
- tput
- tr
- uniq
Соответственно, он будет работать в линукс "из коробки", либо в Windows с помощью специальных прокладок. В качестве "прокладок" может быть или WSL (возможность запускать нативные линуксовые команды), либо так называемый git bash — специальная командная оболочка с встроенными линуксовыми командами.
Установка
В deb-дистрибутивах линукс (Debian, Ubuntu и остальные) команда установки очень проста:
apt install git-quick-statsВ остальных дистрибутивах нужно склонировать репо и установить приложение:
git clone https://github.com/arzzen/git-quick-stats.git && cd git-quick-stats
sudo make installДля Windows, если мы собираемся пользоваться git bash можно просто склонировать репо в нужный каталог:
git clone https://github.com/arzzen/git-quick-stats.gitИспользование
Мне нравится git-клиент GitExtensions, на его примере покажу, как я запускаю это приложение. В GitExtensions открываю локальный репозиторий (в данном примере сам склонированный репо git-quick-stats), перехожу во вкладку Console.

Консоль — это и есть git bash — специальная командная оболочка с возможностью выполнения линуксовых команд.
В консоли пишу путь к файлу скрипта git-quick-stats. Репо я склонировал в каталог Git на диске C, значит путь будет следующим:
C:/GIT/git-quick-stats/git-quick-stats

И нажимаю на Enter
Запускается приложение в интерактивном режиме:

Нужно вписать номер нужной функции и нажать Enter

Это все очень хорошо, но как автоматизировать все это?
git-quick-stats может работать не только интерактивно, но и в режиме скрипта. Например, то же самое, что мы получили интерактивно выше, можно получить командой:
C:/GIT/git-quick-stats/git-quick-stats -TСтатистика скриптом
Ну и прекрасно. Задача решена. Есть замечательный ключ команды, который позволяет выгружать данные сразу в csv, а значит напрямую в эксель.
C:/GIT/git-quick-stats/git-quick-stats -VПравда тут приходится ответить еще на интерактивный вопрос — какая ветка?
Which branch? master
И вот мы получаем экселеподобный текст:
$ C:/GIT/git-quick-stats/git-quick-stats -V
Which branch? master
author,insertions,insertions_per,deletions,deletions_per,files,files_per,commits,commits_per,lines_changed,lines_changed_per
Jess <jessachandler@gmail.com>,31,1%,1,0%,1,0%,1,1%,32,0%
Lukas Mestan <lukas.mestan@hyperia.sk>,88,2%,51,2%,7,3%,7,4%,139,2%
Pawaer <pawaer@t-online.de>,1,0%,1,0%,1,0%,1,1%,2,0%
Jorge Maldonado Ventura <jorgesumle@freakspot.net>,3,0%,3,0%,1,0%,1,1%,6,0%
…
Тут у нас есть автор (author), количество вставленных строк (insertions), удаленных строк (deletions), измененных файлов (files), коммитов (commits), измененных строк (lines_changed), также в колонках с суффиксом _per выведены эти же значения в процентах.
Уважаемые менеджеры, держите статистику.
И тут менеджеры говорят — нам нужна статистика по неделям. Мы планируем работу программистов по неделям, соответственно хотим видеть, статистику по программистам в разрезе недель.
Окей… git-quick-stats умеет работать с периодами. Период нельзя передать параметром, но зато можно указать в переменных окружения.
Для установки начала периода нужно выполнить команду, она устанавливает в переменную окружения _GIT_SINCE дату 2023-01-01:
export _GIT_SINCE=2023-01-01Для установки окончания периода нужно выполнить команду, она устанавливает в переменную окружения _GIT_UNTIL дату 2023-01-31:
export _GIT_UNTIL=2023-01-31Кроме того, нам пригодится команда указания ветки репозитория в переменной окружения:
export _GIT_BRANCH=masterПроверим установку переменной _GIT_BRANCH. Выполним сначала эту команду в консоли, а затем команду вывода статистики в csv формате. Запроса имени ветки больше нет:
$ C:/GIT/git-quick-stats/git-quick-stats -V
author,insertions,insertions_per,deletions,deletions_per,files,files_per,commits,commits_per,lines_changed,lines_changed_per
Jess <jessachandler@gmail.com>,31,1%,1,0%,1,0%,1,1%,32,0%
Lukas Mestan <lukas.mestan@hyperia.sk>,88,2%,51,2%,7,3%,7,4%,139,2%
Pawaer <pawaer@t-online.de>,1,0%,1,0%,1,0%,1,1%,2,0%
…
Итак, напишем скрипт, получающий статистику по репозиторию в разрезе недель. Скрипт будем писать на православном OneScript (а как иначе, я же программист 1С все-таки).
Но как из скрипта запустить git bash? Мы же запускали специальную консоль для работы с git-quick-stats, вряд ли можно указать oscript, чтобы он выполнил команду из git bash…
Оказывается, можно.
У oscript есть библиотека 1commands, библиотека для упрощения работы c запуском различных приложений и командных файлов. В этой библиотеке есть одна очень интересная возможность — запуск командного файла.
Для PowerShell это выглядит так:
КомандныйФайл = Новый КомандныйФайл;
КомандныйФайл.УстановитьПриложение("C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe");
КомандныйФайл.Создать("",".ps1");
КомандныйФайл.ДобавитьКоманду("Get-Help");
Сообщить(КомандныйФайл.ПолучитьТекстФайла());
КодВозврата = КомандныйФайл.Исполнить();Мы же можем сделать точно то же самое и для git bash — создаем командный файл, только в качестве приложения установим "C:\Program Files\Git\bin\bash.exe"
Для использования библиотеки в начале скрипта укажем волшебную директиву:
#Использовать 1commandsИ конечно же, если библиотека еще не установлена в системе, установим ее:
opm install 1commandsИ затем сформируем и выполним командный файл:
КомандныйФайл = Новый КомандныйФайл;
КомандныйФайл.УстановитьПриложение("C:\Program Files\Git\bin\bash.exe");
КомандныйФайл.УстановитьКодировкуВывода(КодировкаТекста.UTF8);
КомандныйФайл.Создать("",".sh");
КомандныйФайл.ДобавитьКоманду(СтрШаблон("export _GIT_SINCE=""""%1""""", Формат(НачалоПериода, "ДФ=yyyy-MM-dd")));
КомандныйФайл.ДобавитьКоманду(СтрШаблон("export _GIT_UNTIL=""""%1""""", Формат(КонецПериода, "ДФ=yyyy-MM-dd")));
КомандныйФайл.ДобавитьКоманду("export _GIT_BRANCH=master");
КомандныйФайл.ДобавитьКоманду("cd Путь/К/Анализируемому/Репо");
КомандныйФайл.ДобавитьКоманду("C:/GIT/git-quick-stats/git-quick-stats -V");
КодВозврата = КомандныйФайл.Исполнить();
Вывод = КомандныйФайл.ПолучитьВывод();Здесь еще пришлось добавить установку кодировки вывода, так как без нее русские имена разработчиков превращались в крякозябры.
Ну а сделать цикл по неделям и распарсить полученный вывод статистики — дело техники.
Общая логика скрипта такова — создаем таблицу значений, куда положим строки с данными статистики. Проходим циклом по нужным периодам. Формируем данные статистики и кладем полученные строчки в общую таблицу. Сохраняем получившуюся таблицу как обычный текстовый файл с разделителями в csv формате.
Приведу листинг функции сохранения таблицы значений в csv. Функция универсальная, может пригодиться не только тут.
Процедура ЗаписатьТаблицуЗначенийНаДиск(ТаблицаЗначений, ИмяФайла)
МассивСтрок = Новый Массив;
МассивОписанияКолонок = Новый Массив;
Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
МассивОписанияКолонок.Добавить(Колонка.Имя);
КонецЦикла;
МассивСтрок.Добавить(СтрСоединить(МассивОписанияКолонок, ";"));
Для Каждого Строка Из ТаблицаЗначений Цикл
ОписаниеСтроки = Новый Массив;
Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ОписаниеСтроки.Добавить(Строка[Колонка.Имя]);
КонецЦикла;
МассивСтрок.Добавить(СтрСоединить(ОписаниеСтроки, ";"));
КонецЦикла;
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла);
ЗаписьТекста.Записать(СтрСоединить(МассивСтрок, Символы.ПС));
ЗаписьТекста.Закрыть();
КонецПроцедурыДавайте еще заведем три параметра у скрипта — куда сохранять полученную статистику, какие репозитории обрабатывать (а их может быть несколько), и с какой даты обрабатывать.
Для работы с параметрами есть библиотека для oscript — cmdline. Операционная система передает аргументы командной строки в виде массива, а библиотека предоставляет интерфейс для доступа к нему:
#Использовать cmdline
Парсер = Новый ПарсерАргументовКоманднойСтроки();
Парсер.ДобавитьИменованныйПараметр("-file");
Парсер.ДобавитьИменованныйПараметр("-repo");
Парсер.ДобавитьИменованныйПараметр("-since");
Параметры = Парсер.Разобрать(АргументыКоманднойСтроки);
ИмяФайла = Параметры["-file"];
Репо = Параметры["-repo"];
НачалоПериодаСтрокой = Параметры["-since"];Теперь можно указывать параметры не в тексте скрипта, в командной строке:
oscript .\git-stat.os -file "my_stat.csv" -repo "C:/GIT/git-quick-stats" -since "20200101"В репозитории git_stat вы можете найти полный текст скрипта — файл называется git-stat.os. Применить его у себя очень просто — проверьте, установлен ли у вас вообще oscript, git и git bash, клонируйте git-quick-stats, проверьте правильность путей до утилиты git bash и git-quick-stats…
… и анализируйте.


