ai-commit is a command-line tool designed to help developers automatically generate meaningful commit messages for their Git repositories using AI. It uses the changes in the working directory to infer a commit message, promoting the use of conventional commits while keeping the messages precise and understandable.
- Generates commit messages using AI based on Git diffs.
- Adheres to conventional commit standards (e.g., feat, fix, refactor).
- Supports multiple logging levels (debug, info, warn, error).
- Option to run in "noop" mode to see the generated commit message without making changes.
- AI model server running at specified URL (Ollama server).
- A AI Model to generate commit messages. By default, it uses the "mistral" model.
ollama pull mistral
- Git installed and configured on the system.
Run the following command to install the ai-commit binary and git extension:
curl -s https://raw.githubusercontent.com/theburrowhub/ai-commit/main/scripts/get-ai-commit.sh | sudo bashClone this repository and build the ai-commit binary:
git clone https://github.com/theburrowhub/ai-commit.git
cd ai-commit
make installThe ai-commit command will use AI to generate a commit message based on the current state of your working directory.
Run the following command in your Git repository:
ai-commitor
git ai-commitThese commands will:
- Gather the current diffs in your working directory.
- Send the diffs to the configured AI model to generate a commit message.
- Commit the changes with the generated message.
- Open your default editor to allow you to modify the commit message before finalizing the commit.
Run the next command to run over docker:
-
Linux:
docker run --network host -it --rm \ -v ${HOME}/.config:/home/ai-commit/.config \ -v $(pwd):/source \ -e GIT_USER_NAME="$(git config --global user.name)" \ -e GIT_USER_EMAIL="$(git config --global user.email)" \ ai-commit:latest -
MacOS:
docker run -it --rm \ -v ${HOME}/.config:/home/ai-commit/.config \ -v $(pwd):/source \ -e GIT_USER_NAME="$(git config --global user.name)" \ -e GIT_USER_EMAIL="$(git config --global user.email)" \ ai-commit:latest --server http://host.docker.internal:11434
Two volumes are mounted:
${HOME}/.config:/home/ai-commit/.config: To store the configuration file.$(pwd):/source: To access the source code.
Environment variables are set to configure the git user:
-e GIT_USER_NAME="$(git config --global user.name)": To set the git user name.-e GIT_USER_EMAIL="$(git config --global user.email)": To set the git user email.
The -it flag is used to run the container in interactive mode to allow using vim to edit the commit message just
generated. And the --rm flag is used to remove the container after it stops. --network host is used to allow the
container to access the host network and connect to the Ollama server.
Any additional arguments passed to the ai-commit command will be forwarded to the Docker container. For example, to
run the command in noop mode --noop can be passed as an argument:
To make it easier you can create an alias in your .bashrc or .zshrc file:
alias ai-commit='docker run --network host -it --rm \
-v ${HOME}/.config:/home/ai-commit/.config \
-v $(pwd):/source \
-e GIT_USER_NAME="$(git config --global user.name)" \
-e GIT_USER_EMAIL="$(git config --global user.name)" \
ai-commit:latest'--noop: Run without making any changes to the Git repository (dry-run mode).--logLevel: Set the logging level (default is "info"). Available levels are "debug", "info", "warn", and "error".--server: Set the Ollama server URL (default ishttp://localhost:11434).--model: Specify the AI model to use for generating the commit message (default is "mistral").--retries,-r: Number of retries for invalid commit messages (default is 3).--quiet: Run in silent mode (no logs). Only errors are printed to stderr.--commitType,-t: Select a commit type by writting the type next to the flag (feat, fix, refactor, docs, style...)
ai-commit --noop --logLevel debugThis will run the command in noop mode, providing detailed logs about the process without actually committing anything.
The configuration file $(HOME)/.config/ai-commit/config.yaml is automatically generated if it does not exist. This
file contains the default values for the ai-commit configuration. Below is an example of the content of this file with
the default values:
noop: false
logLevel: info
ollamaServer: http://localhost:11434
model: mistral
systemPrompt: |-
In an impersonal way, write a commit message that explains what the commit
is for. Use conventional commits and the imperative mood in the first line.
The first line should start with: feat, fix, refactor, docs, style, build,
perf, ci, style, test or chore. Set the file name and the changes made in
the body. Only one subject line is allowed.
An example of commit message is:
feat(file or class): Add user authentication
- Implement user sign-up and login functionality
- Add password hashing for security
- Integrate with authentication API
Add line breaks to separate subject from body.
retriesCommitMessage: 3
numCtx: 4096
numKeep: 512
temperature: 0This file defines the following configuration parameters:
logLevel: Logging level (default is "info").ollamaServer: URL of the Ollama server (default is http://localhost:11434).model: AI model to use for generating commit messages (default is "mistral").systemPrompt: Default template for the commit message.retriesCommitMessage: Number of retries for invalid commit messages (default is 3).numCtx: Number of context tokens (default is 4096).numKeep: Number of tokens to keep in case of truncation (default is 512).temperature: Temperature for sampling (default is 0 - deterministic).
The generated commit message will adhere to the following format:
- A concise subject line following the conventional commit format.
- A detailed body explaining the changes made, if applicable.
- AI communication and inference managed via internal package
ai. - Git operations performed using the internal package
git. - Logging provided via the internal package
logger.
To execute the command during development:
go run ./cmd/main.goThe Makefile provides the following targets to manage building, installing, and cleaning up:
bin: Compiles theai-commitbinary and places it in the./bindirectory.make bin
install: Builds the binary and copies it to/usr/local/binfor system-wide usage.make install
uninstall: Removes the installedai-commitbinary from/usr/local/bin.make uninstall
release: Make a release using goreleaser.make release
test-release: Make a test release using goreleaser.make test-release
bump: Bump the version of the project.make bump
bump-alpha: Bump version using commitizen (alpha)make bump-alpha
bump-beta: Bump version using commitizen (beta)make bump-beta
bump-rc: Bump version using commitizen (release candidate)make bump-rc
clean: Removes the./bindirectory to clean up build artifacts.make clean
Just push a new tag with the version number and the CI/CD pipeline will take care of the rest.
If you want to manually bump the version:
cz bump --increment (MAJOR|MINOR|PATCH)Then push the tag to the repository:
git push --tagsFeel free to submit pull requests or open issues to improve this project.
