Skip to content

Instantly share code, notes, and snippets.

@karpathy
Created August 25, 2024 20:43
Show Gist options
  • Save karpathy/1dd0294ef9567971c1e4348a90d69285 to your computer and use it in GitHub Desktop.
Save karpathy/1dd0294ef9567971c1e4348a90d69285 to your computer and use it in GitHub Desktop.
Git Commit Message AI
# -----------------------------------------------------------------------------
# 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
}
@di-sukharev
Copy link

I have been using:

git commit -m "$(git diff --staged | sgpt "Write a single conventional commits style commit message for this diff on the branch $(git rev-parse --abbrev-ref HEAD).")"

👆

@vlameiras
Copy link

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 alias

https://gist.github.com/vlameiras/8591bf75990571f5f1e2ea9c452047c3

@ammario
Copy link

ammario commented Aug 29, 2024

Similar tool at coder/aicommit that follows a repo's existing commit style.

@appleseed-iii
Copy link

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

@Undertone0809
Copy link

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