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 (requires network; set GITHUB_TOKEN for private repos)

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 (requires network; set GITHUB_TOKEN for private repos)

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.

🔑 GitHub Token (Optional)

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

If GITHUB_TOKEN is not set, a warning will be printed when using --check.

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.

📁 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
⚠️ network_error_clean Remote exists but fetch failed, local is clean
⚠️ network_error_dirty Remote exists but fetch failed, local has uncommitted changes

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

🔧 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.1.tar.gz (19.4 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.1-py3-none-any.whl (18.9 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: oh_my_gitstats-0.2.1.tar.gz
  • Upload date:
  • Size: 19.4 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.1.tar.gz
Algorithm Hash digest
SHA256 4e11f7fe25ed885cae5abc3b530af59639101fdc57f7f184020f90f887d40694
MD5 e5a314004c1afaa0b1327f52de003d41
BLAKE2b-256 ea7272210b0f5d31da74a5f1d5d0f3e08078cb699f0f16e9b6aa3a9ae8cf5134

See more details on using hashes here.

File details

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

File metadata

  • Download URL: oh_my_gitstats-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 18.9 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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 cef6abd5514e5583b181349136e5b3b4bbe96c2a9246c213b2a296154ec48f25
MD5 5182b964692f39eea95de872690e21a8
BLAKE2b-256 7af42dd5762dc43d0cd7ff9f675254579ccba0f3786482a7405cb6909fcb42cb

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