Last active
July 25, 2025 20:43
-
-
Save valmat/44822e1b7c6884bebb25b3ff005117fe to your computer and use it in GitHub Desktop.
AI git commit filler
This file contains hidden or 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
| #!/bin/env bash | |
| set -e | |
| # model="gpt-4.1"; | |
| # temperature=0.8; | |
| model="o3"; | |
| temperature=1; | |
| endpoint_url="https://api.openai.com/v1/chat/completions" | |
| api_key="$OPENAI_API_KEY" | |
| prompt="Below is the output of \`git diff HEAD\`."` | |
| `"\nPlease provide a perfect git commit message."` | |
| `"\nAlways use an emoji as the first character. Use emojis in the message text when appropriate."` | |
| `"\nUse past tense in the message title. The commit message is intended for git, so its format is plain text (not Markdown)."` | |
| `"\nIt would be nice to list the modified files in the commit message." | |
| # checking whether the argument was passed to the script | |
| if ! [[ $# -eq 0 ]]; then | |
| prompt="${prompt}\n\nUse the following hint to generate the commit message: \`$1\`." | |
| fi | |
| prompt="${prompt}"` | |
| `"\nThe commit message language is strictly English."` | |
| `"\n\n(# If there is an error in the code, please report it in the comments to the commit)." | |
| git add . --all | |
| message=$(git diff HEAD) | |
| if [ -z "$message" ]; then | |
| echo "Nothing to commit, working tree clean" >&2 | |
| exit 1 | |
| fi | |
| echo "$message" > "/tmp/gitai-message.txt" | |
| json_payload=$(jq -n \ | |
| --arg model "$model" \ | |
| --arg temperature "$temperature" \ | |
| --arg prompt "$prompt" \ | |
| --rawfile message "/tmp/gitai-message.txt" \ | |
| '{ | |
| model: $model, | |
| temperature: ($temperature | tonumber), | |
| messages: [ | |
| { | |
| role: "system", | |
| content: $prompt | |
| },{ | |
| role: "user", | |
| content: $message | |
| } | |
| ] | |
| }') | |
| echo "$json_payload" > "/tmp/gitai-payload.txt" | |
| rm -f "/tmp/gitai-message.txt" | |
| response=$(curl -s "$endpoint_url" \ | |
| -H "Content-Type: application/json" \ | |
| -H "Authorization: Bearer $api_key" \ | |
| --data-binary "@/tmp/gitai-payload.txt") | |
| # Clean up the temporary file | |
| rm "/tmp/gitai-payload.txt" | |
| # Checking if the "error" key is in the response | |
| if echo "$response" | jq -e '.error' > /dev/null; then | |
| echo "Error: $(echo "$response" | jq -r '.error.message')" >&2 | |
| exit 2 | |
| else | |
| # If there is no error, trying to extract the desired message | |
| content=$(echo "$response" | jq -e -r '.choices[0].message.content') | |
| # Checking if the message was extracted | |
| if ! [[ $? -eq 0 ]]; then | |
| # If the message could not be extracted, | |
| # output the original text of the response to stderr | |
| echo "Failed to extract the message. Response was:" >&2 | |
| echo "$response" >&2 | |
| exit 3 | |
| fi | |
| fi | |
| description_file=$(mktemp) | |
| echo "$content" | sed '/^`\+$/d' > "$description_file" | |
| nano "$description_file" | |
| cat "$description_file" | |
| cat "$description_file" | sed '/^#/d' | sed -e 's/^[ \t\n]*//' -e 's/[ \t\n]*$//' > "${description_file}.tmp" | |
| mv "${description_file}.tmp" "$description_file" | |
| git commit -a --file "$description_file" | |
| rm "$description_file" |
Author
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
gitaiis a bash script for Linux and MacOS that helps you create beautiful, informative, and consistent git commit messages using OpenAI. It adds relevant emojis, writes concise titles in past tense, includes a summary, lists changed files, and even uses English exclusively.A commit message will not only be informative and stylish, but also include AI-powered code review—flagging possible bugs and improvement suggestions in the commit comment section.
Features
Requirements
jq(for JSON parsing)curl(usually pre-installed)nano(or modify the script to use another editor if desired)$OPENAI_API_KEYin your environmentInstallation
Install dependencies:
Download the script:
Copy the latest script from the GitHub Gist or download it directly:
Add to your
$PATH:Make sure
~/binis in yourPATH. You can add this to your~/.bashrc,~/.zshrc, or equivalent:Restart your terminal or run
source ~/.zshrc(or your shell config file).Set your OpenAI API key:
Usage
Navigate to your project directory:
cd /path/to/your/git/projectRun the script:
git addall changesnanoby default) for final tweaks(Optional) Provide a hint for the AI:
gitai "Fix for production crash on startup"Notes
nanowith your preferred text editor.Example