Skip to main content

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

Project description

Git Commits Library

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

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

# 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}")

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

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 python-dateutil

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 0.1.0+
  1. Update the version in pyproject.toml:
[project]
version = "0.1.1"  # Increment as needed
  1. Build the package:
uv build
  1. Publish to PyPI:
uv publish
  1. Test the installation:
uv run --with git-commits --no-project -- python -c "import git_commits"

Authentication

For publishing, you'll need to set up authentication:

  1. Create API tokens on PyPI
  2. Configure uv with your credentials:
# For PyPI
uv config set credentials.pypi.username __token__
uv config set credentials.pypi.password pypi-your-api-token-here

Alternatively, you can use environment variables:

export UV_PUBLISH_USERNAME="__token__"
export UV_PUBLISH_PASSWORD="pypi-your-api-token-here"

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.0.tar.gz (7.7 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.0-py3-none-any.whl (7.3 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for git_commits-1.0.0.tar.gz
Algorithm Hash digest
SHA256 a07c3d880afab15c92b7eb8c588e7f937157aaae2e9bbcb5261e8a30dc1743c0
MD5 ba628dfc4902676863fcad1704a5100b
BLAKE2b-256 01e87793c569a73d7f80e5705415d23081300430e803010a864a74193f29defa

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for git_commits-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8625c3afa8851f5c5b291408a15fa6703aacc7cfb83cc97a8f8803442e05d03f
MD5 804c4a073b9c793140233dd3b6d6e046
BLAKE2b-256 d7881b929830209f515347bf8f68cdf5dc03f47a1135c215f76fb9ddcf7edb22

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