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 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
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
- 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 0.1.0+
- Update the version in
pyproject.toml:
[project]
version = "0.1.1" # Increment as needed
- Build the package:
uv build
- Publish to PyPI:
uv publish
- 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:
- Create API tokens on PyPI
- 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
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.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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a07c3d880afab15c92b7eb8c588e7f937157aaae2e9bbcb5261e8a30dc1743c0
|
|
| MD5 |
ba628dfc4902676863fcad1704a5100b
|
|
| BLAKE2b-256 |
01e87793c569a73d7f80e5705415d23081300430e803010a864a74193f29defa
|
File details
Details for the file git_commits-1.0.0-py3-none-any.whl.
File metadata
- Download URL: git_commits-1.0.0-py3-none-any.whl
- Upload date:
- Size: 7.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.7.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8625c3afa8851f5c5b291408a15fa6703aacc7cfb83cc97a8f8803442e05d03f
|
|
| MD5 |
804c4a073b9c793140233dd3b6d6e046
|
|
| BLAKE2b-256 |
d7881b929830209f515347bf8f68cdf5dc03f47a1135c215f76fb9ddcf7edb22
|