Clean Git History
A Git history linter to ensure it stays clean for those who prefer a linear history without merge commits.
Content
Usage
Clean Git History checks the commits from the current HEAD(inclusively) till a provided Git reference(exclusively).
This reference can be a branch, commit or tag, just provide it as the final argument.
e.g.
Git Environment Variables
When looking for a repository the Git environment variables are respected.
When ${GIT_DIR} is set, it takes precedence and Clean History begins searching for a repository in the directory specified in ${GIT_DIR}.
When ${GIT_DIR} is not set, Clean History searches for a repository beginning in the current directory.
Logging
The crates pretty_env_logger and log are used to provide logging.
The environment variable RUST_LOG can be used to set the logging level.
See https://crates.io/crates/pretty_env_logger for more detailed documentation.
Examples
GitHub Actions
name: Git History
on: pull_request
jobs:
clean:
name: Clean
runs-on: ubuntu-latest
steps:
- name: Checkout code.
uses: actions/checkout@4
with:
ref: ${{ github.event.pull_request.head.sha }}
fetch-depth: 0
- name: Install Clean Git history.
run: version="v1.0.1" && wget -O - "https://github.com/DeveloperC286/clean_git_history/releases/download/${version}/x86_64-unknown-linux-musl.tar.gz" | tar xz --directory "/usr/bin/"
- name: Check clean Git history.
run: clean-git-history "origin/${{ github.base_ref }}"
GitLab CI
clean-git-history-checking:
stage: clean-git-history-checking
image: rust
before_script:
- version="v1.0.1" && wget -O - "https://github.com/DeveloperC286/clean_git_history/releases/download/${version}/x86_64-unknown-linux-musl.tar.gz" | tar xz --directory "/usr/bin/"
script:
- clean_git_history "origin/${CI_MERGE_REQUEST_TARGET_BRANCH_NAME}"
rules:
- if: $CI_MERGE_REQUEST_ID
Git Hook
An example pre-push Git hook to check if the history of a project is clean before it is pushed to the remote server.
#!/usr/bin/env bash
branch=
Installing
Binary
Statically linked compiled binaries are available for download. Visit the releases page at https://github.com/DeveloperC286/clean_git_history/releases to see all the releases, the release notes contains links to binary downloads for various architectures.
version="v1.0.1" && |
Cargo
Cargo is the Rust package manager, the install sub-command pulls from crates.io and then compiles the binary locally, placing the compiled binary at ${HOME}/.cargo/bin/clean_git_history.
By default it installs the latest version at the time of execution.
You can specify a specific version to install using the --version argument.
For certain environments such as CICD etc you may want to pin the version.
e.g.
See https://doc.rust-lang.org/cargo/commands/cargo-install.html#install-options for more detailed documentation.
Development
Setup
You need Earthly and Docker installed, Earthly handles all build and runtime dependencies.
Commands
Git History
Conventional Commits
Formatting
Check
rust, python, shell and yaml
Fix
rust, python, shell and yaml
Linting
rust, shell and github-actions-workflows
Compiling
Testing
Issues/Feature Requests
To report an issue or request a new feature use https://github.com/DeveloperC286/clean_git_history/issues.