Skip to content

Instantly share code, notes, and snippets.

@Yankzy
Forked from karpathy/add_to_zshrc.sh
Created August 26, 2024 11:37
Show Gist options
  • Save Yankzy/39aeed78bfac698ffcbf5a866ae2f159 to your computer and use it in GitHub Desktop.
Save Yankzy/39aeed78bfac698ffcbf5a866ae2f159 to your computer and use it in GitHub Desktop.

Revisions

  1. @karpathy karpathy created this gist Aug 25, 2024.
    78 changes: 78 additions & 0 deletions add_to_zshrc.sh
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,78 @@
    # -----------------------------------------------------------------------------
    # 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
    }