无需插件,PowerShell 秒变智能:用 Ollama 自动生成 Git 提交信息

在软件开发过程中,编写清晰且符合规范的 Git 提交信息至关重要。为了提高效率和规范性,可以利用 Ollama 和 PowerShell 脚本自动生成提交信息。本文将介绍如何实现这一功能。

前置条件

  • git
  • ollama,并 pull model , 比如这里使用 codegeex4:latest

1. 添加 PowerShell 函数

执行notepad $PROFILE 添加加以下内容,其中 model codegeex4:latest,你可以改成其它 model (qwen2.5-coder、deepseek-coder-v2),请参考ollama.com/library?q=c... :

php 复制代码
function gco {
    # Function to generate commit message
    function Generate-CommitMessage {
        $diff = git diff --cached
        $message = $diff | & ollama run codegeex4:latest "
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, conforming to the Conventional Commits specification."
        return $message
    }

    # Function to read user input
    function Read-Input {
        param (
            [string]$Prompt
        )
        Write-Host -NoNewline $Prompt
        return Read-Host
    }

    # Main script
    Write-Host "Generating..."
    $commitMessage = Generate-CommitMessage

    while ($true) {
        Write-Host "`nProposed commit message:"
        Write-Host $commitMessage

        $choice = Read-Input "Do you want to (a)ccept, (e)dit, (r)egenerate, or (c)ancel? "

        switch ($choice.ToLower()) {
            'a' {
                if ($commitMessage) {
                    git commit -m "$commitMessage"
                    if ($?) {
                        Write-Host "Changes committed successfully!"
                        return 0
                    } else {
                        Write-Host "Commit failed. Please check your changes and try again."
                        return 1
                    }
                } else {
                    Write-Host "Commit message cannot be empty. Please try again."
                }
            }
            'e' {
                $commitMessage = Read-Input "Enter your commit message: "
                if ($commitMessage) {
                    git commit -m "$commitMessage"
                    if ($?) {
                        Write-Host "Changes committed successfully with your message!"
                        return 0
                    } else {
                        Write-Host "Commit failed. Please check your message and try again."
                        return 1
                    }
                } else {
                    Write-Host "Commit message cannot be empty. Please try again."
                }
            }
            'r' {
                Write-Host "Regenerating commit message..."
                $commitMessage = Generate-CommitMessage
            }
            'c' {
                Write-Host "Commit cancelled."
                return 1
            }
            default {
                Write-Host "Invalid choice. Please try again."
            }
        }
    }
}

除此之外,你还可以使用其它网络上的大语言模型 api 端点,比如使用 github model 的 gpt-4o-mini

php 复制代码
function Invoke-ChatCompletion {
    param (
        [string]$GitHubToken = "你的 GitHub 令牌填写在此处",
        [string]$UserMessage,
        [string]$SystemMessage = "You are a helpful assistant."
    )

    # 设置请求头
    $headers = @{
        "Content-Type" = "application/json"
        "Authorization" = "Bearer $GitHubToken"
    }

    # 创建请求体
    $body = @{
        "messages" = @(
            @{
                "role" = "system"
                "content" = $SystemMessage
            },
            @{
                "role" = "user"
                "content" = $UserMessage
            }
        )
        "temperature" = 1.0
        "top_p" = 1.0
        "max_tokens" = 1000
        "model" = "gpt-4o-mini"
    }

    # 将请求体转换为 JSON 格式
    $bodyJson = $body | ConvertTo-Json

    try {
        # 发送 POST 请求
        $response = Invoke-RestMethod -Uri "https://models.inference.ai.azure.com/chat/completions" -Method Post -Headers $headers -Body $bodyJson

        # 输出响应中的 content 内容
        $content = $response.choices[0].message.content
        Write-Output $content
    } catch {
        # 输出错误信息
        Write-Error $_.Exception.Message
    }
}

function Generate-CommitMessage {
    $diff = git diff --cached
    $userMessage = @"
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, conforming to the Conventional Commits specification.
$diff
"@

    # 调用 Invoke-ChatCompletion 函数生成提交信息
    $commitMessage = Invoke-ChatCompletion -GitHubToken "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" -UserMessage $userMessage
    return $commitMessage
}

function Read-Input {
    param (
        [string]$Prompt
    )
    Write-Host -NoNewline $Prompt
    return Read-Host
}

function gco {
    Write-Host "Generating..."
    $commitMessage = Generate-CommitMessage

    while ($true) {
        Write-Host "`nProposed commit message:"
        Write-Host $commitMessage

        $choice = Read-Input "Do you want to (a)ccept, (e)dit, (r)egenerate, or (c)ancel? "

        switch ($choice.ToLower()) {
            'a' {
                if ($commitMessage) {
                    git commit -m "$commitMessage"
                    if ($?) {
                        Write-Host "Changes committed successfully!"
                        return 0
                    } else {
                        Write-Host "Commit failed. Please check your changes and try again."
                        return 1
                    }
                } else {
                    Write-Host "Commit message cannot be empty. Please try again."
                }
            }
            'e' {
                $commitMessage = Read-Input "Enter your commit message: "
                if ($commitMessage) {
                    git commit -m "$commitMessage"
                    if ($?) {
                        Write-Host "Changes committed successfully with your message!"
                        return 0
                    } else {
                        Write-Host "Commit failed. Please check your message and try again."
                        return 1
                    }
                } else {
                    Write-Host "Commit message cannot be empty. Please try again."
                }
            }
            'r' {
                Write-Host "Regenerating commit message..."
                $commitMessage = Generate-CommitMessage
            }
            'c' {
                Write-Host "Commit cancelled."
                return 1
            }
            default {
                Write-Host "Invalid choice. Please try again."
            }
        }
    }
}

2. 执行,生成 git commit message

在 PowerShell 执行. $PROFILE 重新加载配置文件,在项目目录执行 gco

相关推荐
LucianaiB10 小时前
【元宝搜索开发者征文大赛】AI时代,学得慢就不用学?用元宝搜索打造一个教程保质期,确保每一个教程符合你的现状
前端·人工智能·ai编程
excel10 小时前
JavaScript 对象池:减少高频对象创建与 GC 压力
前端
陈随易12 小时前
纯 Go 写的 JS 引擎,跑分超过了 C 语言的 QuickJS
前端·后端·程序员
子兮曰13 小时前
Chrome 权限元素实战:144 与 151 的渐进增强写法
前端·javascript·chrome
IT_陈寒14 小时前
Redis连接池泄漏那次,我差点把生产环境搞崩了
前端·人工智能·后端
强尼银手14 小时前
我花一天做了个格斗游戏原型,判定全对,然后被「美术」劝退了
前端·javascript
石小石Orz14 小时前
AI 正在蚕食我们的编码能力
前端·后端·算法
陈随易14 小时前
专注飞机 FocusFlight,两个人把番茄钟做成了一趟航班
前端·后端·程序员
总要学点什么15 小时前
第98篇:三维特效-材质线效果——给一条线换十种材质,虚线的图案只填了一半
开发语言·前端·javascript·ecmascript·gis·webgl·材质
10share15 小时前
基于大模型的 i18n 方案:把中文原文当 Key,轻松搞定多语言维护
前端·vue.js