A Git history linter to ensure it stays clean for those who prefer a linear history without merge commits.
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.
clean_git_history "origin/main"
clean_git_history "v0.2.0"
clean_git_history "bac789b4cc5fce9a26d6805c5da4bf17241523f1"
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.
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.4" && 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 }}"
clean-git-history-checking:
stage: clean-git-history-checking
image: rust
before_script:
- version="v1.0.4" && 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
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
set -o errexit
set -o pipefail
branch=$(git branch --show-current)
"${HOME}/.cargo/bin/clean_git_history" "origin/${branch}"
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.4" && wget -O - "https://github.com/DeveloperC286/clean_git_history/releases/download/${version}/x86_64-unknown-linux-musl.tar.gz" | tar xz --directory "/usr/bin/"
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
.
cargo install 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.
cargo install clean_git_history --version "1.0.4"
See https://doc.rust-lang.org/cargo/commands/cargo-install.html#install-options for more detailed documentation.
You need Earthly and Docker installed, Earthly handles all build and runtime dependencies.
earthly +check-clean-git-history
earthly +check-conventional-commits-linting
earthly +check-formatting
rust
, python
, shell
and yaml
earthly +check-{language}-formatting
earthly +fix-formatting
rust
, python
, shell
and yaml
earthly +fix-{language}-formatting
earthly +check-linting
rust
, shell
and github-actions-workflows
earthly +check-{language}-linting
earthly +compile
earthly +end-to-end-test
earthly +static-binary-test
earthly +unit-test
To report an issue or request a new feature use https://github.com/DeveloperC286/clean_git_history/issues.