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
}
@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