Gaining advanced insights from Git repository history.
Gaining advanced insights from Git repository history.
Fast, insightful and highly customizable Git history analysis.
Overview • How To Use • Installation • Contributions • License
-------- Table of Contents ================= * [Overview](#overview) * [Installation](#installation) * [Build from source](#build-from-source) * [GitHub Action](#github-action) * [Contributions](#contributions) * [License](#license) * [Usage](#usage) * [Caching](#caching) * [GitHub Action](#github-action-1) * [Docker image](#docker-image) * [Built-in analyses](#built-in-analyses) * [Project burndown](#project-burndown) * [Files](#files) * [People](#people) * [Churn matrix](#overwrites-matrix) * [Code ownership](#code-ownership) * [Couples](#couples) * [Structural hotness](#structural-hotness) * [Aligned commit series](#aligned-commit-series) * [Added vs changed lines through time](#added-vs-changed-lines-through-time) * [Efforts through time](#efforts-through-time) * [Sentiment (positive and negative comments)](#sentiment-positive-and-negative-comments) * [Everything in a single pass](#everything-in-a-single-pass) * [Plugins](#plugins) * [Merging](#merging) * [Bad unicode errors](#bad-unicode-errors) * [Plotting](#plotting) * [Custom plotting backend](#custom-plotting-backend) * [Caveats](#caveats) * [Burndown Out-Of-Memory](#burndown-out-of-memory) * [Roadmap](#roadmap) ## Overview Hercules is an amazingly fast and highly customizable Git repository analysis engine written in Go. Batteries are included. Powered by [go-git](https://github.com/go-git/go-git). *Notice (November 2020): the main author is back from the limbo and is gradually resuming the development. See the [roadmap](#roadmap).* There are two command-line tools: `hercules` and `labours`. The first is a program written in Go which takes a Git repository and executes a Directed Acyclic Graph (DAG) of [analysis tasks](doc/PIPELINE_ITEMS.md) over the full commit history. The second is a Python script which shows some predefined plots over the collected data. These two tools are normally used together through a pipe. It is possible to write custom analyses using the plugin system. It is also possible to merge several analysis results together - relevant for organizations. The analyzed commit history includes branches, merges, etc. Hercules has been successfully used for several internal projects at [source{d}](https://sourced.tech). There are blog posts: [1](https://blog.sourced.tech/post/hercules-v4), [2](https://blog.sourced.tech/post/hercules) and a [presentation](http://vmarkovtsev.github.io/gowayfest-2018-minsk/). Please [contribute](#contributions) by testing, fixing bugs, adding [new analyses](https://github.com/src-d/hercules/issues?q=is%3Aissue+is%3Aopen+label%3Anew-analysis), or coding swagger!The DAG of burndown and couples analyses with UAST diff refining. Generated with hercules --burndown --burndown-people --couples --feature=uast --dry-run --dump-dag doc/dag.dot https://github.com/src-d/hercules
torvalds/linux line burndown (granularity 30, sampling 30, resampled by year). Generated with hercules --burndown --first-parent --pb https://github.com/torvalds/linux | labours -f pb -m burndown-project in 1h 40min.
Wireshark top 20 devs - overwrites matrix
``` hercules --burndown --burndown-people [--people-dict=/path/to/identities] labours -m overwrites-matrix ``` Beside the burndown information, `--burndown-people` collects the added and deleted line statistics per developer. Thus it can be visualized how many lines written by developer A are removed by developer B. This indicates collaboration between people and defines expertise teams. The format is the matrix with N rows and (N+2) columns, where N is the number of developers. 1. First column is the number of lines the developer wrote. 2. Second column is how many lines were written by the developer and deleted by unidentified developers (if `--people-dict` is not specified, it is always 0). 3. The rest of the columns show how many lines were written by the developer and deleted by identified developers. The sequence of developers is stored in `people_sequence` YAML node. #### Code ownershipEmber.js top 20 devs - code ownership
``` hercules --burndown --burndown-people [--people-dict=/path/to/identities] labours -m ownership ``` `--burndown-people` also allows to draw the code share through time stacked area plot. That is, how many lines are alive at the sampled moments in time for each identified developer. #### Couplestorvalds/linux files' coupling in Tensorflow Projector
``` hercules --couples [--people-dict=/path/to/identities] labours -m couples -o [--couples-tmp-dir=/tmp] ``` **Important**: it requires Tensorflow to be installed, please follow [official instructions](https://www.tensorflow.org/install/). The files are coupled if they are changed in the same commit. The developers are coupled if they change the same file. `hercules` records the number of couples throughout the whole commit history and outputs the two corresponding co-occurrence matrices. `labours` then trains [Swivel embeddings](https://github.com/src-d/tensorflow-swivel) - dense vectors which reflect the co-occurrence probability through the Euclidean distance. The training requires a working [Tensorflow](http://tensorflow.org) installation. The intermediate files are stored in the system temporary directory or `--couples-tmp-dir` if it is specified. The trained embeddings are written to the current working directory with the name depending on `-o`. The output format is TSV and matches [Tensorflow Projector](http://projector.tensorflow.org/) so that the files and people can be visualized with t-SNE implemented in TF Projector. #### Structural hotness ``` 46 jinja2/compiler.py:visit_Template [FunctionDef] 42 jinja2/compiler.py:visit_For [FunctionDef] 34 jinja2/compiler.py:visit_Output [FunctionDef] 29 jinja2/environment.py:compile [FunctionDef] 27 jinja2/compiler.py:visit_Include [FunctionDef] 22 jinja2/compiler.py:visit_Macro [FunctionDef] 22 jinja2/compiler.py:visit_FromImport [FunctionDef] 21 jinja2/compiler.py:visit_Filter [FunctionDef] 21 jinja2/runtime.py:__call__ [FunctionDef] 20 jinja2/compiler.py:visit_Block [FunctionDef] ``` Thanks to Babelfish, hercules is able to measure how many times each structural unit has been modified. By defaNo open issues yet, or sync has not completed.