-
-
Save karpathy/1dd0294ef9567971c1e4348a90d69285 to your computer and use it in GitHub Desktop.
# ----------------------------------------------------------------------------- | |
# 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 | |
} |
what about small models with 7b parametres, is it will be good at it?
you can also accomplish this using code ~/.gitconfig
and adding:
[alias]
ai = "!f() { git add . && if [ -n \"$(git diff --cached)\" ]; then git commit -m \"$(git diff --cached | llm -m '4o-mini' 'Below is a diff of all staged changes, coming from the command:\\n```\\ngit diff --cached\\n```\\nPlease generate a concise, one-line commit message for these changes.')\" && git push; else echo 'No changes to commit'; fi }; f"
for some reason the zshrc option lost my local branch context but .gitconfig worked
Additionally, you can also set up a vscode keybinding (cmd + shift + P on mac) to open up the JSON:
// Place your key bindings in this file to override the defaultsauto[]
[
{
"key": "cmd+enter",
"command": "workbench.action.terminal.sendSequence",
"args": { "text": "git ai\n" }
},
....
now you can just do "cmd + enter" to get commit messages quickly.
It goes without saying that you should install [llm](https://llm.datasette.io/en/stable/)
locally via brew or another method and connect your openai api key.
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).")"
Extremely useful!
(1) I have replaced llm
with ollama run llama3.1
.
(2) Something was already taking the gcm command, I added unalias gcm 2>/dev/null
before.
check this https://github.com/Fl0p/gitpmoji
generate commit message / decorate with emoji / give rating / evaluate diff
pros - uses git hook don't need any additional. cons - uses only openAI api
So cool
For oh-my-zsh users, on .zshrc
I added
# must unalias all ZSH defaults here AFTER we source the above
unalias gcm
after
source $ZSH/oh-my-zsh.sh
To make sure the gcm
alias stays ripped out between sessions.
Forked this no-brainer cheap solution for Git commits!
Google Gemini works great with it, especially with the free tier. For testing, use gemini-1.5-flash. Here is my fork,
https://gist.github.com/HtutLynn/7fe83d64d6381726ac06e9fb7f972643
Quick start:
Install the Gemini plugin:
llm install llm-gemini
Set up your API key.
Happy committing! π
@karpathy i make the nodejs version https://github.com/koisose/auto-commit-gaia no need for api key coz its using gaianet.ai also using llama
Forked this no-brainer cheap solution for Git commits!
Google Gemini works great with it, especially with the free tier. For testing, use gemini-1.5-flash. Here is my fork,
https://gist.github.com/HtutLynn/7fe83d64d6381726ac06e9fb7f972643
Quick start:
Install the Gemini plugin:
llm install llm-gemini
Set up your API key.
Happy committing! π
@HtutLynn cant agree more i create both for gemini and groq as well the groq one using gemma and its super fast as well https://github.com/koisose/auto-commit-gemini and https://github.com/koisose/auto-commit-groq
guys, use https://github.com/di-sukharev/opencommit, it's the most feature rich open-source tool
run npm i -g opencommit
, then oco config set OCO_OPENAI_API_KEY=your_key
and then sumply run oco
to generate your git commit messages.
πππ
guys, use https://github.com/di-sukharev/opencommit, it's the most feature reach open-source tool
run
npm i -g opencommit
, thenoco config set OCO_OPENAI_API_KEY=your_key
and then sumply runoco
to generate your git commit messages.πππ
Oh, nice job! Thxπ
guys, use https://github.com/di-sukharev/opencommit, it's the most feature reach open-source tool
run
npm i -g opencommit
, thenoco config set OCO_OPENAI_API_KEY=your_key
and then sumply runoco
to generate your git commit messages.πππ
ππ
guys, use https://github.com/di-sukharev/opencommit, it's the most feature reach open-source tool
run
npm i -g opencommit
, thenoco config set OCO_OPENAI_API_KEY=your_key
and then sumply runoco
to generate your git commit messages.πππ
Oh, I was looking for this repo but forgot the name, thanks!
guys, use https://github.com/di-sukharev/opencommit, it's the most feature reach open-source tool
runnpm i -g opencommit
, thenoco config set OCO_OPENAI_API_KEY=your_key
and then sumply runoco
to generate your git commit messages.
πππOh, I was looking for this repo but forgot the name, thanks!
You are welcome π©
check this https://github.com/Fl0p/gitpmoji generate commit message / decorate with emoji / give rating / evaluate diff pros - uses git hook don't need any additional. cons - uses only openAI api
take a look at https://github.com/di-sukharev/opencommit, we even support llama running locally or remotely
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).")"
π
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
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.
I've been using this one for a while. it has a little more detail on how a commit message should be formatted.