Мне лень писать комментарии к git-коммитам. Пусть их теперь пишет ИИ.

Контекст

В айтишном мире комментарии к коммитам играют важную роль, беря на себя часть нагрузки по передаче знаний.

Часто на их основе даже генерируют changelog-и и определяют бамп версий.

Я сам, как живой человек, часто утомляюсь в очередной раз писать “добавляю комментарий” или “исправляю опечатку”. Инструменты автоматизации могут помочь снять этот груз. Один из интересных подходов - использовать ИИ для генерации сообщений к коммитам.

Важно не переборщить. Хороший коммит должен объяснять, (а) что мы поменяли в репозитории на смысловом уровне, и (б) что произойдёт, если этот коммит накатить на предыдущее состояние кода.

Плохой коммит: добавлен метод process_payment в файл internal/payment/process.go

Хороший коммит: feat(payments): добавлена обработка платежей

Также я не рекомендовал бы полностью отказываться от идеи формулировать комментарии к коммитам самостоятельно, если вы начинающий инженер.

Git-хуки

В объективно победившей на массовом рынке системе контроля версий, git-е, есть такая приятная фича как хуки.

Она позволяет автоматически выполнить какие-то действия между различными стадиями публикации кода.

Git предоставляет удобный инструмент в виде хуков, которые позволяют выполнять скрипты на определённых этапах жизненного цикла репозитория.

Нас тут заинтересует этап prepare-commit-msg, но можно также подумать о том, чтобы внедрить куда-то ещё.

Почему бы не собирать метрики о том, что ты коммитишь за день, и потом оперировать этой метрикой на performance review? 👨‍💻

Какой AI использовать

Внешние API, OpenAI

Можно нагрузить различные ChatGPT через API, это сведётся к простому http-вызову:

https://openai.com/api/

Важно отметить, что сегодня мир вносит определенные сложности в вопросы оплаты заграничных сервисов для тех, кто находится в РФ. Можно решить эти проблемы при помощи VPN, но под эту конкретную задачу проще воспользоваться каким-то проксирующим сервисом. Например, я пользуюсь proxyapi.ru.

Локальный инстанс, Ollama

Я использую Ollama как локальный агрегирующий API для работы с различными LLM.

В зависимости от вашей ОС, установка может разниться, для меня это свелось к простому:

$ sudo pacman -S ollama

После этого мы можем начать диалог просто через CLI команду:

$ ollama run some-model
>>> Send a message (/? for help)

Далее может быть хорошей идеей добавить некий UI, чтобы было удобно быстро протестировать новые промпты и гипотезы. Здесь я остановился на Open WebUI.

Собираем всё вместе

Добавляем git-хук

Git поддерживает хуки в локальной копии репозитория, в директории .git/hooks. Проблема этой механики в том, что тогда хук вам придётся устанавливать в каждый репозиторий, с которым вы работаете.

К счастью, git также поддерживает и установку общих хуков в общем конфигурационном файле .gitconfig, который применится ко всем репозиториям, с которыми вы работаете.

Установить такой хук можно следующим образом:

# .giconfig

[core]
  hooksPath = /home/USER/.githooks

Пишем скрипт вызова AI

Положим в упомянутую выше директорию скрипт, который передаёт в LLM staged-изменения и просит её их резюмировать с учётом, например, Conventional Commits:

/home/USER/.githooks/prepare-commit-msg

#!/bin/bash

COMMIT_MSG_FILE=${1}

# Models:
#   https://ollama.com/library
AI_MODEL="phi4"
AI_TIMEOUT="60s"

TMP_FILE=$(mktemp --suffix=.git-commit)

REPO_DIFF=$(git diff --cached --unified=0)

# Get summary from AI

timeout ${AI_TIMEOUT} ollama run ${AI_MODEL} > "${TMP_FILE}.resp" << EOF
Generate single, short and solid commit message for the given git diff.
Keep commit message as short as possible.
Follow "conventional commits" notation for this single message.
Keep the first line 100 characters max and place details (if any) after double newline.
Do NOT include any additional text or thoughts in the answer, other than commit message itself.
Do NOT enclose message in markdown code block.
Do NOT use capital letters in first line.
Do NOT describe obvious changes, only summarized impact.

---

${REPO_DIFF}
EOF

SUMMARY=$(cat "${TMP_FILE}.resp")

# Write result

if [ -f "${COMMIT_MSG_FILE}" ]; then
  # Save the AI generated summary to the commit message file
  echo "${SUMMARY}" >"${COMMIT_MSG_FILE}"
  # Append existing message if it exists
  if [ -n "${EXISTING_MSG}" ]; then
    echo "" >>"${COMMIT_MSG_FILE}"
    echo "${EXISTING_MSG}" >>"${COMMIT_MSG_FILE}"
  fi
fi

Проверяем в работе

Запускаю git commit напротив материала этой статьи и видим подготовленный вариант комментария:

feat(post): add AI-generated commit messages article

Added an article discussing the use of AI for generating git commit messages, focusing on tools like OpenAI API and Ollama. It explains the process and potential benefits of using Git hooks with AI to automate commit message creation. The article highlights how this can save time and effort in writing conventional commits.

Результат отличный - первая строка кратко и точно описывает суть коммита, а далее идёт весьма подробное описание.

А что по скорости?

Генерация на NVIDIA RTX 3050 заняла около 10 секунд, что не супер, но вполне допустимо.

Коллега с новой моделью MacBook сообщал о более приятных результатах. Как я понимаю, в новых M-процессорах от Apple есть NPU, но я не шарю.

Энивей, даже если у вас медленный CPU и нет графического адаптера, можно предварительно анализировать diff и спрашивать локальный ИИ только в том случае, если изменение небольшое. А большие сгружать куда-то ещё. Или не дёргать железного друга вовсе, оставляя действительно сложные diff-ы на человека. Нужна же и нам какая-то работа.

Подытожим

  • ИИ может забрать на себя часть ежедневной рутины
  • Лучше добавить ИИ-инструменты в свой арсенал, чем не добавлять

Ссылки