GitHunt
SG

sgaunet/gitcommit

CLI tool to create Git commits with custom historical dates while maintaining chronological integrity

gitcommit - Git Commit Date Setter

Go Report Card
GitHub release
GitHub Downloads
Coverage Badge
linter
coverage
Snapshot Build
Release Build
License

A command-line tool that enables developers to create Git commits with specific historical dates while maintaining chronological integrity.

Features

  • โœจ Create commits with custom dates in format YYYY-MM-DD HH:MM:SS
  • ๐Ÿ”’ Validates dates maintain chronological order (no backdating before last commit)
  • ๐ŸŒ Automatic local timezone detection
  • ๐Ÿš€ Fast and lightweight (Go stdlib only, no external dependencies)
  • ๐Ÿ“ Clear, actionable error messages
  • โœ… POSIX-compliant CLI interface (--help, --version)

Installation

From Source

git clone https://github.com/sgaunet/gitcommit.git
cd gitcommit
make install

Verify Installation

gitcommit --version

Quick Start

# Stage your changes
git add .

# Create commit with custom date
gitcommit "2025-02-05 20:19:19" "Historical commit message"

Usage

gitcommit <date> <message>

Arguments:

  • <date>: Date and time in format YYYY-MM-DD HH:MM:SS
  • <message>: Commit message text

Flags:

  • --help, -h: Show usage information
  • --version, -v: Show version number

Examples

# Basic usage
gitcommit "2025-02-05 20:19:19" "Add feature X"

# Backdating offline work
gitcommit "2025-01-15 10:00:00" "Work done offline"

# First commit in new repository
git init
git add README.md
gitcommit "2025-01-01 00:00:00" "Initial commit"

Requirements

  • Go: 1.21 or later (for building)
  • Git: 2.20 or later
  • Platforms: Linux, macOS, Windows

Date Format Rules

  • โœ… Format: YYYY-MM-DD HH:MM:SS (24-hour time)
  • โœ… Date must be after the last commit in the repository
  • โœ… Future dates are allowed
  • โœ… Empty repositories accept any date
  • โŒ Dates equal to or before the last commit are rejected

Development

# Build
make build

# Run tests
make test

# Run linter
make lint

# Format code
make fmt

# View all commands
make help

Testing

# Run all tests with coverage
make coverage

# Run specific test
go test -v ./internal/datetime/...

Architecture

cmd/gitcommit/          # CLI entry point
internal/
  โ”œโ”€โ”€ cli/              # CLI logic and orchestration
  โ”œโ”€โ”€ datetime/         # Date parsing, validation, formatting
  โ””โ”€โ”€ git/              # Git repository operations
tests/
  โ”œโ”€โ”€ integration/      # Integration tests
  โ””โ”€โ”€ testdata/         # Test fixtures

Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Commit your changes
  4. Push to the branch
  5. Open a Pull Request

License

MIT License - see LICENSE file for details.

Use Cases

  • ๐Ÿ“… Organizing repository history chronologically
  • ๐Ÿ’ผ Backdating work done offline
  • ๐Ÿ”„ Migrating commits from other version control systems
  • ๐Ÿ“Š Maintaining accurate project timelines

Troubleshooting

Error: "Invalid date format"

  • Use exact format: YYYY-MM-DD HH:MM:SS
  • Example: 2025-02-05 20:19:19

Error: "Chronology violation"

  • Ensure date is after your last commit
  • Check: git log -1 --format="%aI"

Error: "Not a Git repository"

  • Run from inside a Git repository
  • Or initialize: git init

Performance

  • Date parsing & validation: <10ms
  • Git operations: <100ms
  • Total operation: <200ms (p95)

Credits

Built with โค๏ธ using Go standard library only.


Version: 1.0.0
Status: Production Ready

sgaunet/gitcommit | GitHunt