git-commit-aider MCP-сервер
Делайте коммиты git от имени ИИ, чтобы вы могли отслеживать вклад ИИ в вашу кодовую базу.
Это MCP-сервер на основе TypeScript, который предоставляет инструмент для фиксации подготовленных изменений в репозитории Git с добавлением «(aider)» к имени коммиттера.
Функции
Этот сервер MCP предоставляет только один инструмент:
commit_staged — зафиксировать подготовленные изменения с определенным сообщением.
Принимает
message(строка, обязательно) в качестве сообщения фиксации.Принимает
cwd(строка, необязательно) для указания рабочего каталога для команды git.Автоматически добавляет «(aider)» к имени коммиттера.
Считывает имя и адрес электронной почты коммиттера из переменных среды (
GIT_COMMITTER_NAME,GIT_COMMITTER_EMAIL), если они заданы, в противном случае возвращается кgit config user.nameиgit config user.email.
Установив этот инструмент в редакторе кода, вы можете дать ИИ команду, например:
Зафиксируйте изменения для меня
Обычно это происходит после того, как ИИ вносит некоторые изменения в вашу кодовую базу, поэтому зачастую ИИ может предоставить хорошее сообщение о коммите из контекста.
Related MCP server: GitLab MCP Server
Установка
Чтобы использовать этот сервер, добавьте его конфигурацию в файл настроек MCP.
{
"mcpServers": {
"git-commit-aider": {
"command": "npx",
"args": ["mcp-git-commit-aider"]
}
}
}Информация о коммиттере извлекается из:
Переменные окружения
GIT_COMMITTER_NAMEиGIT_COMMITTER_EMAIL, которые соответствуют соглашениям git .Вывод команд
git config user.nameиgit config user.email.
Альтернатива: изменить автора после фиксации
Если вы не хотите использовать этот сервер MCP, вы также можете использовать команду git непосредственно в своем терминале.
Сначала можно выполнить обычный коммит, а затем использовать следующую команду git, чтобы изменить автора последнего коммита:
git commit --amend --author="$(git config user.name) (aider) <$(git config user.email)>"Это изменит автора последнего коммита на ваше имя с добавлением «(aider)».
Чтобы упростить процесс, вы можете настроить псевдоним Git. Выполните следующую команду в терминале:
git config --global alias.aimend '!git commit --amend --author="$(git config user.name) (aider) <$(git config user.email)>"'После настройки вы можете использовать псевдоним, выполнив:
git aimendРасчет вклада ИИ
Коммиты с «(aider)» можно просмотреть с помощью команды aider --stats , которая покажет вклад ИИ в вашу кодовую базу.
В качестве альтернативы вы можете использовать следующий скрипт для расчета вклада ИИ в вашу кодовую базу, измеряемого в строках кода (добавленных, удаленных и общих изменений).
#!/bin/bash
# Script to calculate line changes (added, deleted, total) by AI and human authors
# between two commits.
# Output is in JSON format.
#
# This logic is extracted and altered from git-quick-stats.sh, MIT license.
# --- Configuration ---
# You may change the config to match your repository's convention.
# String to identify AI-generated commits in author names
AI_MATCHER="(aider)"
# Define patterns for files/paths to be excluded from the calculation.
# These will be converted to git pathspecs like ":(exclude)*package-lock.json"
IGNORE_PATTERNS=(
"*package-lock.json"
"*.lock"
)
# --- Helper Functions ---
function print_usage() {
echo "Usage: $0 <REVISION_RANGE>"
echo " <REVISION_RANGE>: The revision range to analyze (e.g., HEAD~5..HEAD, my-branch, commit_sha)."
echo " Refer to 'git help log' or 'git help revisions' for more range options."
echo "Example: $0 HEAD~5..HEAD"
echo "Example: $0 origin..HEAD"
echo "Example: $0 my-feature-branch"
echo "Example: $0 abcdef1..fedcba2"
}
# --- Argument Parsing ---
if [ "$#" -ne 1 ]; then
echo "Error: Incorrect number of arguments. Please provide a single revision range."
print_usage
exit 1
fi
REVISION_RANGE="$1"
# --- Main Logic ---
# Construct pathspec arguments for git log
pathspec_args=()
for pattern in "${IGNORE_PATTERNS[@]}"; do
pathspec_args+=(":(exclude)$pattern")
done
git_log_output=$(git log "$REVISION_RANGE" --numstat --pretty="format:AuthorName:%an" -- "${pathspec_args[@]}")
# DEBUG: Uncomment to check the calculation for each commit.
# echo "$git_log_output"
# Process the log output with awk
result_json=$(echo "$git_log_output" | awk -v ai_matcher="$AI_MATCHER" '
BEGIN {
ai_added = 0
ai_deleted = 0
human_added = 0
human_deleted = 0
current_author = ""
is_ai_author = 0
}
/^AuthorName:/ {
# Extract author name
current_author = substr($0, length("AuthorName:") + 1)
if (index(current_author, ai_matcher) > 0) {
is_ai_author = 1
} else {
is_ai_author = 0
}
next
}
# Skip empty lines between commit blocks or lines that are not numstat
NF == 0 || !($1 ~ /^[0-9]+$/ && $2 ~ /^[0-9]+$/) {
next
}
# Process numstat line: <added> <deleted> <file>
{
added_lines = $1
deleted_lines = $2
# Skip binary files where numstat shows "-" for lines
if (added_lines == "-" || deleted_lines == "-") {
next
}
# Aggregate stats per author and file for details array
file_name = $3
# Robust key using File Separator character \034
key = current_author "\034" file_name
file_author_added[key] += added_lines
file_author_deleted[key] += deleted_lines
if (is_ai_author) {
ai_added += added_lines
ai_deleted += deleted_lines
} else {
human_added += added_lines
human_deleted += deleted_lines
}
}
END {
ai_total_changed = ai_added + ai_deleted
human_total_changed = human_added + human_deleted
overall_total_changed = ai_total_changed + human_total_changed
ai_percentage = 0.00
if (overall_total_changed > 0) {
ai_percentage = (ai_total_changed / overall_total_changed) * 100
}
printf "{\n"
printf " \"ai_percentage\": %.2f,\n", ai_percentage
printf " \"ai_changes\": {\"added\": %d, \"deleted\": %d, \"total\": %d},\n", ai_added, ai_deleted, ai_total_changed
printf " \"human_changes\": {\"added\": %d, \"deleted\": %d, \"total\": %d},\n", human_added, human_deleted, human_total_changed
# Details array
printf " \"details\": [\n"
first_detail = 1
# Iterate over one of the arrays, keys should be consistent
for (key in file_author_added) {
if (!first_detail) {
printf ",\n"
}
first_detail = 0
# Split key "author\034fileName" into key_parts array
# key_parts[1] will be author, key_parts[2] will be fileName
split(key, key_parts, "\034")
author = key_parts[1]
fileName = key_parts[2]
# Escape double quotes for JSON compatibility
gsub(/"/, "\\\"", author)
gsub(/"/, "\\\"", fileName)
detail_added = file_author_added[key] + 0 # Ensure numeric
detail_deleted = file_author_deleted[key] + 0 # Ensure numeric
detail_total = detail_added + detail_deleted
printf " {\n"
printf " \"fileName\": \"%s\",\n", fileName
printf " \"author\": \"%s\", \"isAI\": %s,\n", author, (index(author, ai_matcher) > 0 ? "true" : "false")
printf " \"added\": %d, \"deleted\": %d, \"total\": %d\n", detail_added, detail_deleted, detail_total
printf " }"
}
printf "\n ]\n"
printf "}\n"
}
')
# --- Output ---
echo "$result_json"Пример использования:
# Assume the script is saved as `calculate_ai_contribution.sh` and is executable (chmod +x calculate_ai_contribution.sh)
# Example 1: Analyze the last 5 commits
./calculate_ai_contribution.sh HEAD~5..HEAD
# Example 2: Analyze commits between a specific commit and HEAD
./calculate_ai_contribution.sh 90a5fcd4..HEAD
# Example 3: Analyze all commits on a feature branch not yet in main
./calculate_ai_contribution.sh main..my-feature-branch
# Example 4: Analyze commits between two tags
./calculate_ai_contribution.sh v1.0..v1.1
# Example output (will vary based on your repository and range):
# {
# "ai_percentage": 48.53,
# "ai_changes": { "added": 100, "deleted": 32, "total": 132 },
# "human_changes": { "added": 103, "deleted": 37, "total": 140 },
# "details": [
# {
# "fileName": "src/featureA.js",
# "author": "Developer One (aider)", "isAI": true,
# "added": 60, "deleted": 10, "total": 70
# },
# {
# "fileName": "src/featureB.js",
# "author": "Developer One (aider)", "isAI": true,
# "added": 40, "deleted": 22, "total": 62
# },
# {
# "fileName": "src/utils.js",
# "author": "Developer Two", "isAI": false,
# "added": 80, "deleted": 15, "total": 95
# },
# {
# "fileName": "README.md",
# "author": "Developer Two", "isAI": false,
# "added": 23, "deleted": 22, "total": 45
# }
# ]
# }Описание выходных полей
Вывод JSON содержит следующие поля:
ai_percentage: (Число) Процент от общего числа измененных строк (сумма добавленных и удаленных строк), которые были внесены авторами ИИ (идентифицируютсяAI_MATCHER).ai_changes: (Объект) Объект, детализирующий агрегированные изменения строк (addedстроки,deletedи ихtotal), внесенные авторами ИИ.human_changes: (Объект) Объект, описывающий агрегированные изменения строк (added,deletedстроки и ихtotal), внесенные авторами-людьми.details: (Массив объектов) Предоставляет подробную разбивку изменений. Каждый объект в массиве представляет вклад конкретногоauthorв конкретныйfileName, включаяaddedстроки,deletedиtotalизменения для этого файла этим автором.
Resources
Looking for Admin?
Admins can modify the Dockerfile, update the server description, and track usage metrics. If you are the server author, to access the admin panel.