Created
August 25, 2024 20:43
-
-
Save karpathy/1dd0294ef9567971c1e4348a90d69285 to your computer and use it in GitHub Desktop.
Git Commit Message AI
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# ----------------------------------------------------------------------------- | |
# AI-powered Git Commit Function | |
# Copy paste this gist into your ~/.bashrc or ~/.zshrc to gain the `gcm` command. It: | |
# 1) gets the current staged changed diff | |
# 2) sends them to an LLM to write the git commit message | |
# 3) allows you to easily accept, edit, regenerate, cancel | |
# But - just read and edit the code however you like | |
# the `llm` CLI util is awesome, can get it here: https://llm.datasette.io/en/stable/ | |
gcm() { | |
# Function to generate commit message | |
generate_commit_message() { | |
git diff --cached | llm " | |
Below is a diff of all staged changes, coming from the command: | |
\`\`\` | |
git diff --cached | |
\`\`\` | |
Please generate a concise, one-line commit message for these changes." | |
} | |
# Function to read user input compatibly with both Bash and Zsh | |
read_input() { | |
if [ -n "$ZSH_VERSION" ]; then | |
echo -n "$1" | |
read -r REPLY | |
else | |
read -p "$1" -r REPLY | |
fi | |
} | |
# Main script | |
echo "Generating AI-powered commit message..." | |
commit_message=$(generate_commit_message) | |
while true; do | |
echo -e "\nProposed commit message:" | |
echo "$commit_message" | |
read_input "Do you want to (a)ccept, (e)dit, (r)egenerate, or (c)ancel? " | |
choice=$REPLY | |
case "$choice" in | |
a|A ) | |
if git commit -m "$commit_message"; then | |
echo "Changes committed successfully!" | |
return 0 | |
else | |
echo "Commit failed. Please check your changes and try again." | |
return 1 | |
fi | |
;; | |
e|E ) | |
read_input "Enter your commit message: " | |
commit_message=$REPLY | |
if [ -n "$commit_message" ] && git commit -m "$commit_message"; then | |
echo "Changes committed successfully with your message!" | |
return 0 | |
else | |
echo "Commit failed. Please check your message and try again." | |
return 1 | |
fi | |
;; | |
r|R ) | |
echo "Regenerating commit message..." | |
commit_message=$(generate_commit_message) | |
;; | |
c|C ) | |
echo "Commit cancelled." | |
return 1 | |
;; | |
* ) | |
echo "Invalid choice. Please try again." | |
;; | |
esac | |
done | |
} |
Similar tool at coder/aicommit that follows a repo's existing commit style.
i suggest adding a parameter to bypass the ai-generated message when the user passes the -m
flag
so that gcm -m 'my user-generated commit msg'
allows a user to enter their own message without pinging the llm.
to do that you can add the following to line 11.
# Check if -m flag is provided
if [ "$1" = "-m" ] && [ -n "$2" ]; then
# Use the provided message directly
if git commit -m "$2"; then
echo "Changes committed successfully with your message!"
return 0
else
echo "Commit failed. Please check your message and try again."
return 1
fi
fi
Here's a more convenient git ai copilot: https://github.com/Undertone0809/gcop
Benefits:
- Easier to use with git alias, which means just use the git command
- Compatible with all LLMs, easy to configure no matter what model you're using.
- Various git alias extensions to help you use git commands more easily.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Made some changes so it doesn't make calls when there are no staged changes. Renamed the command to
gai
due to conflict with the Oh My ZSH aliashttps://gist.github.com/vlameiras/8591bf75990571f5f1e2ea9c452047c3