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 repositoryauthor(str, optional): Filter commits by author's name or email (case-insensitive partial matching)since(Union[str, datetime], optional): Filter commits authored after this dateuntil(Union[str, datetime], optional): Filter commits authored before this datetimezone(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 commitshort_sha(str): First 7 characters of the SHA-1 hashauthor_name(str): Name of the commit authorauthor_email(str): Email of the commit authorauthored_datetime(datetime): Timezone-aware datetime when the commit was authoredmessage(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 authoremail(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
- Clone the repository:
git clone https://github.com/theArjun/git-commits.git
cd git-commits
- Install with development dependencies using uv:
uv install -e ".[dev]"
- Run the examples:
python main.py
- Run tests (when available):
pytest
- Format code:
black src/ tests/
isort src/ tests/
- Type checking:
mypy src/
Publishing to PyPI
This project is configured to be published using uv. Here's how to publish:
- Ensure you have the latest version of uv:
uv --version # Should be 1.0.1+
- Update the version in
pyproject.toml:
[project]
version = "1.0.1" # Increment as needed
- Build the package:
uv build
- Publish to PyPI:
uv publish
More on publishing can be found here
- 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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
509224d15f0bdb55c86a50724f5c9d14bd961e8c8ecfcf7060fa5df5d151fa03
|
|
| MD5 |
149103ca9c7c7e692c31be9dbbd37292
|
|
| BLAKE2b-256 |
8d3f1b09e9f65f16e37a207149b522232c4012b93cffd50a5e5f825d23e0725b
|
File details
Details for the file git_commits-1.0.1-py3-none-any.whl.
File metadata
- Download URL: git_commits-1.0.1-py3-none-any.whl
- Upload date:
- Size: 7.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e2c8efead2f72c5044c83e7d66127d5d7454c5ad8a39d02b32786ab7dbca41e
|
|
| MD5 |
ed9162b86531d8394bd1150dc3239e50
|
|
| BLAKE2b-256 |
fe3138f42c6a2e2f0217db3546fc78288fe81429f138ec6e8f45da673a40870d
|