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.
Metadata
Release files for git-commits 1.0.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| git_commits-1.0.1.tar.gz | 7.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| git_commits-1.0.1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 15.7 kB
Release files / git_commits-1.0.1.tar.gz
| Download URL | git_commits-1.0.1.tar.gz |
|---|---|
| Size | 7.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
509224d15f0bdb55c86a50724f5c9d14bd961e8c8ecfcf7060fa5df5d151fa03
|
|
BLAKE2b-256 checksum How to use checksums |
8d3f1b09e9f65f16e37a207149b522232c4012b93cffd50a5e5f825d23e0725b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.7.3
|
Release files / git_commits-1.0.1-py3-none-any.whl
| Download URL | git_commits-1.0.1-py3-none-any.whl |
|---|---|
| Size | 7.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8e2c8efead2f72c5044c83e7d66127d5d7454c5ad8a39d02b32786ab7dbca41e
|
|
BLAKE2b-256 checksum How to use checksums |
fe3138f42c6a2e2f0217db3546fc78288fe81429f138ec6e8f45da673a40870d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
uv/0.7.3
|