Skip to content

yuriybylinkin/git_stat

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 

Repository files navigation

Получаем статистику по git-репозиторию в разрезе разработчиков

Введение

Итак! Представим, что наступил момент, когда разработка через исходный код реализована на предприятии в полном объеме. Мы разрабатываем в EDT или конфигураторе (но выгружаем конфигурацию в исходный код), версионируем внешние отчеты и обработки и расширения, собираем релизы, проверяем код статическим анализом, в разработке царит гармония и мир. Красота! Но менеджерам этого мало, всегда хочется чего-то еще, и вот мне прилетает задача - дай статистику по вкладу в код каждого разработчика. Задача решаема - есть исходный код, есть репо с историей, значит ничто не может помешать получить нужную информацию.

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

Поиск по ключевым словам git+stat на github дал множество репозиториев с программами на разных языках, помогающих оформить профиль, специализированных на github, среди которых почти затерялся репо git-quick-stats.

Предоставлю слово великолепному README.md этого репо (перевод мой):

git-quick-stats — это простой и эффективный способ доступа к различной статистике в репозитории git.
Любой репозиторий git может содержать массу информации о коммитах, участниках и файлах. Извлечение этой информации не всегда просто, в основном потому, что существует огромное количество опций для огромного количества команд git — не думаю, что есть хоть один человек, который знает их все. Наверное, даже сам Линус Торвальдс не знает их:)

Давайте посмотрим, как выглядит статистика, получаемая git-quick-stats. Для получения этих картинок я обработал репозиторий самого этого приложения git-quick-stats.

git-commit-per-author git-commit-per-year

Интересно, правда?

Этот инструмент представляет из себя исполняемый 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.

gitextensions

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

C:/GIT/git-quick-stats/git-quick-stats

gitextensions-console

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

interactive-menu

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

contribution-stats

Это все очень хорошо, но как автоматизировать все это? 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... Оказывается, можно. У оскрипт есть библиотека 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"

В этом репозитории вы можете найти полный текст скрипта. Применить его у себя очень просто - проверьте, установлен ли у вас вообще oscript, git и git bash, клонируйте git-quick-stats, проверьте правильность путей до утилиты git bash и git-quick-stats.

И анализируйте.

table

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published