GitFame — консольная утилита на Go для подсчёта и анализа статистики вкладов разработчиков в Git-репозиторий. Программа анализирует историю коммитов и вычисляет для каждого автора (или коммитера) количество строк кода, коммитов и затронутых файлов.
- Высокая производительность: применяется параллельная обработка файлов и воркер-пул для одновременного выполнения
git blame. - Гибкая фильтрация: поддерживаются фильтры по расширениям, языкам и glob-паттернам (
--exclude,--restrict-to). - Несколько форматов вывода:
tabular,csv,json,json-lines. - Настраиваемая сортировка: результаты можно сортировать по
lines,commitsилиfiles.
Убедитесь, что у вас установлен Go (версии 1.20+), а также доступна команда git в системе.
Сборка:
git clone <URL_репозитория>
cd gitfame
go build -o gitfame ./cmd/gitfame/main.goЗапуск по умолчанию в текущей директории:
./gitfameАнализ указанного репозитория и ревизии с выводом в JSON, сортировка по количеству файлов:
./gitfame --repository=/path/to/repo --revision=main --order-by=files --format=jsonАнализ только файлов с расширениями .go и .md, исключая vendor:
./gitfame --extensions=.go,.md --exclude="vendor/*"| Флаг | Тип | Значение по умолчанию | Описание |
|---|---|---|---|
--repository |
string |
. |
Путь к Git-репозиторию для анализа. |
--revision |
string |
HEAD |
Указатель на коммит/ветку/тег для расчёта статистики. |
--order-by |
string |
lines |
Ключ сортировки результатов. Допустимые значения: lines, commits, files. |
--use-committer |
bool |
false |
Использовать Committer-а вместо Author-а при подсчете статистики. |
--format |
string |
tabular |
Формат вывода. Допустимые значения: tabular, csv, json, json-lines. |
--extensions |
строки |
Список расширений файлов через запятую, которые будут участвовать в подсчете (например, .go,.md). |
|
--languages |
строки |
Список языков программирования через запятую (маппинг расширений берется из configs/language_extensions.json). |
|
--exclude |
строки |
Glob-паттерны файлов/директорий, которые нужно исключить из анализа. | |
--restrict-to |
строки |
Glob-паттерны; файлы, не попадающие ни под один из них, будут игнорироваться. |
tabular: человекочитаемая таблица с выравниванием колонок (используетсяtext/tabwriter).csv: заголовок и строки в формате CSVName,Lines,Commits,Files.json: единый JSON-массив объектов{name, lines, commits, files}.json-lines: NDJSON, по одному JSON-объекту на строку.
cmd/gitfame/main.go— точка входа, парсинг флагов и запуск пайплайна.configs/— статические конфигурационные файлы, подключаемые черезgo:embed.internal/config/— обработка CLI-флагов и формирование конфигурации приложения.internal/git/— взаимодействие с Git (ls-tree,blame --porcelain) черезos/exec.internal/filter/— фильтрация списка файлов по правилам.internal/statistics/— параллельная агрегация метрик и сортировка результатов.internal/format/— формирование вывода в соответствующем формате.internal/errors/— определения и обработка ошибок.
Интеграционные тесты находятся в test/integration/gitfame_test.go.
Подход к тестированию:
- В
test/integration/testdata/bundles/хранятся.bundleфайлы — снапшоты репозиториев для тестов. - В
test/integration/testdata/tests/находятся каталоги с тест-кейсами; каждый содержитdescription.yamlиexpected.out. TestMainсобирает бинарникgitfameодин раз и использует его в под-тестах.
Запуск интеграционных тестов:
go test ./test/integration/... -vС проверкой на гонки данных:
go test -race ./... -v