Skip to main content

Git repository commit statistics collector and visualizer

Project description

📊 oh-my-gitstats

中文 | English

A Python CLI tool for collecting git commit statistics and visualizing them as interactive HTML charts.

Line Chart Heatmap

✨ Features

  • 🔍 Batch Collection - Scan multiple git repositories recursively
  • Incremental Sync - Only fetch new commits since last collection
  • 📈 Line Charts - Track changes over time with metric & granularity switching
  • 🗓️ Calendar Heatmaps - Visualize commit activity with year-based filtering
  • 🎯 Aggregated & Individual Views - See combined or per-repo statistics
  • 📂 VS Code Integration - Open repo folders directly from the HTML report

🚀 Installation

From PyPI (Recommended)

pip install oh-my-gitstats

From Source (Development)

git clone https://github.com/amomorning/oh-my-gitstats.git
cd oh-my-gitstats
pip install -e .

📖 Usage

1️⃣ Collect Commit Data

Scan a directory for git repositories and export to JSON:

gitstats collect /path/to/repos --output ./data

Options:

Option Description
-o, --output Directory to save JSON files (default: ./data)
-q, --quiet Suppress output messages
--check Check GitHub archive status for each repository

2️⃣ Incremental Sync

You may collect repos from multiple locations into the same data directory. Re-running collect on every location is slow — sync reads the existing JSON files and only fetches new commits for each repo:

# Collect from multiple locations (one-time)
gitstats collect /path/to/work-projects --output ./data
gitstats collect /path/to/personal-projects --output ./data

# Later, update all at once — only new commits
gitstats sync ./data

Options:

Option Description
-q, --quiet Suppress output messages
--check Check GitHub archive status for each repository

3️⃣ Generate Visualization

Create an interactive HTML file from collected data:

gitstats visualize ./data --output ./output/stats.html

Options:

Option Description
-o, --output HTML file path (default: ./output/stats.html)

Granularity and metric can be switched dynamically in the generated HTML — no need to regenerate.

📁 Output

The generated HTML contains:

  1. 📈 Line Chart - Changes over time with metric selector (Lines Changed / Commit Count) and granularity selector (Day/Week/Month). Click legend to toggle projects.

  2. 🗓️ Aggregate Heatmap - Combined activity across all repos with year selector (All Years / specific year).

  3. 📊 Individual Heatmaps - Per-repository calendar views in a responsive grid, each with sync status indicator and a "Continue" / "Archived" button to open in VS Code.

alt text

📋 JSON Format

Each repository generates a JSON file:

{
  "repo_name": "my-project",
  "repo_path": "/absolute/path/to/my-project",
  "last_commit_hash": "a1b2c3d4...",
  "sync_status": "synced",
  "is_archived": false,
  "commits": [
    {
      "timestamp": "2024-01-15T10:30:00",
      "additions": 45,
      "deletions": 12
    }
  ]
}

The last_commit_hash field stores the HEAD commit hash at collection time. During sync, repositories with a matching hash are skipped instantly — no git operations needed.

The sync_status field indicates the repository's sync state with its remote:

Status Description
synced In sync with remote
✏️ local_changes Local has uncommitted changes, remote is up-to-date
⬇️ remote_ahead Local is clean, but remote has new commits
⚠️ diverged Local has uncommitted changes and remote has new commits
🔒 local_only_clean No remote configured, local is clean
🔧 local_only_dirty No remote configured, local has uncommitted changes

The is_archived field indicates whether the repository is archived on GitHub. Set by sync --check. Values: true (archived), false (active), null (not checked or check failed). Archived repos show a grayed-out "Archived" button in the visualization.

🔑 GitHub Token (Optional)

sync --check queries the GitHub API to check archive status. Without authentication, only public repositories can be checked (rate limit: 60 requests/hour).

To check private repositories, set the GITHUB_TOKEN environment variable:

Linux / macOS

export GITHUB_TOKEN=ghp_your_token_here
gitstats sync ./data --check

Windows (PowerShell)

Set for current session:

$env:GITHUB_TOKEN="ghp_your_token_here"
gitstats sync ./data --check

Set permanently via GUI: SettingsSystemAboutAdvanced system settingsEnvironment Variables → User variables → New

Verify the value:

echo $env:GITHUB_TOKEN

How to get a token

  1. Go to GitHubSettingsDeveloper settingsPersonal access tokensTokens (classic)
  2. Click Generate new token (classic)
  3. Give it a name (e.g. oh-my-gitstats)
  4. Under Select scopes, no additional scopes are needed (public repo access is default)
  5. To access private repositories, check the repo scope
  6. Click Generate token and copy the value (starts with ghp_)

Note: Use Tokens (classic), not Fine-grained tokens.

With a token, the rate limit increases to 5,000 requests/hour.

🔧 Requirements

  • Python 3.9+
  • click
  • gitpython
  • pyecharts
  • jinja2
  • requests

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

oh_my_gitstats-0.2.0.tar.gz (18.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

oh_my_gitstats-0.2.0-py3-none-any.whl (18.1 kB view details)

Uploaded Python 3

File details

Details for the file oh_my_gitstats-0.2.0.tar.gz.

File metadata

  • Download URL: oh_my_gitstats-0.2.0.tar.gz
  • Upload date:
  • Size: 18.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for oh_my_gitstats-0.2.0.tar.gz
Algorithm Hash digest
SHA256 62b6f210ba7099fdefe89d63d604d35e8ae9d80991300216ff6cfff39f3b39f7
MD5 b895878b09dbff39c14ed76eb155444b
BLAKE2b-256 a5caa43d9a2aa4d0a4a323b09ba61ec7b8cdd20561040e6148838ef4cb9e4411

See more details on using hashes here.

File details

Details for the file oh_my_gitstats-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: oh_my_gitstats-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 18.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.9

File hashes

Hashes for oh_my_gitstats-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 889b5d0bb0b26247f9d3e33f644ab118f626406599e6648aec6ebfa920a27d17
MD5 7c8f19b931b171270c72dae35e5c7f28
BLAKE2b-256 12223eee7545afcefba2055cd4900ffc1507d8eeb771976086346756d5cf7b07

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page