Skip to main content

A Python library for listing Git commits from local repositories with advanced filtering options

Project description

Git Commits

A Python library for listing Git commits from local repositories with advanced filtering options.

Features

  • 📝 List commits from any local Git repository
  • 👤 Filter commits by author (name or email, case-insensitive)
  • 📅 Filter commits by date range with flexible date parsing
  • 🌍 Timezone support for date filtering
  • 🌿 Support for searching across all branches
  • 🛡️ Robust error handling
  • 📦 Clean dataclass-based return objects
  • 👥 List unique authors in a repository

Installation

Install from PyPI:

pip install git-commits

Or using uv:

uv add git-commits

For development installation:

git clone https://github.com/theArjun/git-commits.git
cd git-commits
uv install -e .

Quick Start

from git_commits import list_git_commits, get_repo_authors

# List all commits from current repository
commits = list_git_commits(".")

# Print first few commits
for commit in commits[:3]:
    print(f"{commit.short_sha} - {commit.author_name}: {commit.message}")

# List all unique authors in the repository
authors = get_repo_authors(".")
for author in authors:
    print(f"{author.name} <{author.email}>")

API Reference

list_git_commits(repo_path, **kwargs)

List Git commits from a specified local repository with filtering options.

Parameters

  • repo_path (str): The absolute or relative path to the local Git repository
  • author (str, optional): Filter commits by author's name or email (case-insensitive partial matching)
  • since (Union[str, datetime], optional): Filter commits authored after this date
  • until (Union[str, datetime], optional): Filter commits authored before this date
  • timezone (str, optional): Timezone string for interpreting string dates (defaults to "UTC")
  • all_branches (bool, optional): If True, search across all branches (defaults to False)

Returns

List of GitCommit objects with the following attributes:

  • sha (str): Full SHA-1 hash of the commit
  • short_sha (str): First 7 characters of the SHA-1 hash
  • author_name (str): Name of the commit author
  • author_email (str): Email of the commit author
  • authored_datetime (datetime): Timezone-aware datetime when the commit was authored
  • message (str): Full commit message

get_repo_authors(repo_path)

Get a list of unique authors from a Git repository.

Parameters

  • repo_path (str): The absolute or relative path to the local Git repository

Returns

List of RepoAuthor objects with the following attributes:

  • name (str): Name of the author
  • email (str): Email of the author

Example

from git_commits import get_repo_authors

authors = get_repo_authors("/path/to/repo")
for author in authors:
    print(f"{author.name} <{author.email}>")

Usage Examples

Basic Usage

from git_commits import list_git_commits

# List all commits
commits = list_git_commits("/path/to/repo")

# List commits from current directory
commits = list_git_commits(".")

Filter by Author

# Filter by author name (case-insensitive)
commits = list_git_commits(".", author="john")

# Filter by email
commits = list_git_commits(".", author="john@example.com")

Date Filtering

Using String Dates

# Commits since a specific date
commits = list_git_commits(".", since="2024-01-01")

# Commits in the last week
commits = list_git_commits(".", since="1 week ago")

# Commits between dates
commits = list_git_commits(
    ".", 
    since="2024-01-01", 
    until="2024-12-31"
)

# Relative dates
commits = list_git_commits(".", since="yesterday")
commits = list_git_commits(".", since="2 months ago")

Using Datetime Objects

from datetime import datetime
import pytz

# Using timezone-aware datetime objects
eastern = pytz.timezone('America/New_York')
since_dt = eastern.localize(datetime(2024, 1, 1))
until_dt = datetime.now(eastern)

commits = list_git_commits(
    ".", 
    since=since_dt, 
    until=until_dt
)

Timezone Support

# Interpret string dates in a specific timezone
commits = list_git_commits(
    ".",
    since="2024-01-01 09:00:00",
    timezone="America/New_York"
)

Search Across All Branches

# Include commits from all branches (including remote-tracking)
commits = list_git_commits(".", all_branches=True)

Combined Filters

# Combine multiple filters
commits = list_git_commits(
    ".",
    author="john",
    since="1 month ago",
    until="now",
    timezone="UTC",
    all_branches=True
)

Working with Results

commits = list_git_commits(".")

for commit in commits:
    print(f"SHA: {commit.sha}")
    print(f"Short SHA: {commit.short_sha}")
    print(f"Author: {commit.author_name} <{commit.author_email}>")
    print(f"Date: {commit.authored_datetime}")
    print(f"Message: {commit.message}")
    print("-" * 50)

Supported Date Formats

The library supports various date string formats:

  • ISO dates: "2024-01-01", "2024-01-01 15:30:00"
  • Relative dates: "yesterday", "today", "now"
  • Relative periods: "1 week ago", "2 months ago", "3 days ago"
  • Natural language: Most date strings parseable by dateparser

Error Handling

The library gracefully handles various error conditions:

  • Invalid repository paths
  • Non-Git repositories
  • Invalid date strings
  • Permission errors

In case of errors, an informative message is printed and an empty list is returned.

# This will print an error message and return []
commits = list_git_commits("/invalid/path")

Requirements

  • Python 3.9+
  • GitPython >= 3.1.40
  • dateparser >= 1.2.1
  • pytz >= 2024.1

Development

Setting up for Development

  1. Clone the repository:
git clone https://github.com/theArjun/git-commits.git
cd git-commits
  1. Install with development dependencies using uv:
uv install -e ".[dev]"
  1. Run the examples:
python main.py
  1. Run tests (when available):
pytest
  1. Format code:
black src/ tests/
isort src/ tests/
  1. Type checking:
mypy src/

Publishing to PyPI

This project is configured to be published using uv. Here's how to publish:

  1. Ensure you have the latest version of uv:
uv --version  # Should be 1.0.1+
  1. Update the version in pyproject.toml:
[project]
version = "1.0.1"  # Increment as needed
  1. Build the package:
uv build
  1. Publish to PyPI:
uv publish

More on publishing can be found here

  1. Test the installation:
uv run --with git-commits --no-project -- python -c "import git_commits"

License

MIT License - see LICENSE file for details.

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

git_commits-1.0.1.tar.gz (7.9 kB view details)

Uploaded Source

Built Distribution

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

git_commits-1.0.1-py3-none-any.whl (7.8 kB view details)

Uploaded Python 3

File details

Details for the file git_commits-1.0.1.tar.gz.

File metadata

  • Download URL: git_commits-1.0.1.tar.gz
  • Upload date:
  • Size: 7.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.7.3

File hashes

Hashes for git_commits-1.0.1.tar.gz
Algorithm Hash digest
SHA256 509224d15f0bdb55c86a50724f5c9d14bd961e8c8ecfcf7060fa5df5d151fa03
MD5 149103ca9c7c7e692c31be9dbbd37292
BLAKE2b-256 8d3f1b09e9f65f16e37a207149b522232c4012b93cffd50a5e5f825d23e0725b

See more details on using hashes here.

File details

Details for the file git_commits-1.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for git_commits-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 8e2c8efead2f72c5044c83e7d66127d5d7454c5ad8a39d02b32786ab7dbca41e
MD5 ed9162b86531d8394bd1150dc3239e50
BLAKE2b-256 fe3138f42c6a2e2f0217db3546fc78288fe81429f138ec6e8f45da673a40870d

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