git-commit-aider MCP-Server
Führen Sie Git-Commits im Namen der KI durch, damit Sie den KI-Beitrag in Ihrer Codebasis verfolgen können.
Dies ist ein TypeScript-basierter MCP-Server, der ein Tool zum Commit von stufenweisen Änderungen in einem Git-Repository bereitstellt, wobei „(aider)“ an den Namen des Committers angehängt wird.
Merkmale
Dieser MCP-Server bietet nur ein Tool:
commit_staged – Übernehmen Sie stufenweise Änderungen mit einer bestimmten Nachricht.
Nimmt message (Zeichenfolge, erforderlich) als Commit-Nachricht.
Nimmt cwd (Zeichenfolge, optional) zur Angabe des Arbeitsverzeichnisses für den Git-Befehl.
Fügt dem Committer-Namen automatisch „(aider)“ hinzu.
Liest den Namen und die E-Mail-Adresse des Committers aus den Umgebungsvariablen ( GIT_COMMITTER_NAME , GIT_COMMITTER_EMAIL ), sofern diese festgelegt sind, andernfalls wird auf git config user.name und git config user.email zurückgegriffen.
Wenn dieses Tool in Ihrem Code-Editor installiert ist, können Sie die KI mit etwas wie Folgendem auffordern:
Übernehmen Sie die Änderungen für mich
Dies geschieht normalerweise, nachdem die KI einige Änderungen an Ihrer Codebasis vorgenommen hat, sodass die KI häufig in der Lage ist, aus dem Kontext heraus eine gute Commit-Nachricht bereitzustellen.
Installation
Um diesen Server zu verwenden, fügen Sie seine Konfiguration zu Ihrer MCP-Einstellungsdatei hinzu.
{
"mcpServers": {
"git-commit-aider": {
"command": "npx",
"args": ["mcp-git-commit-aider"]
}
}
}
Die Committer-Informationen werden abgerufen von:
Umgebungsvariablen GIT_COMMITTER_NAME und GIT_COMMITTER_EMAIL , die der Git-Konvention folgen.
Ausgabe der Befehle git config user.name und git config user.email .
Alternative: Autor nach dem Commit ändern
Wenn Sie diesen MCP-Server nicht verwenden möchten, können Sie den git -Befehl auch direkt in Ihrem Terminal verwenden.
Sie können zunächst mit dem normalen Commit fortfahren und dann den folgenden Git-Befehl verwenden, um den Autor des letzten Commits zu ändern:
git commit --amend --author="$(git config user.name) (aider) <$(git config user.email)>"
Dadurch wird der Autor des letzten Commits in Ihren Namen mit dem Zusatz „(aider)“ geändert.
Um den Vorgang zu vereinfachen, können Sie einen Git-Alias einrichten. Führen Sie den folgenden Befehl in Ihrem Terminal aus:
git config --global alias.aimend '!git commit --amend --author="$(git config user.name) (aider) <$(git config user.email)>"'
Nach der Einrichtung können Sie den Alias verwenden, indem Sie Folgendes ausführen:
Berechnung des KI-Beitrags
Commits mit „(aider)“ können mit dem Befehl aider --stats abgerufen werden, der Ihnen den Beitrag der KI in Ihrer Codebasis anzeigt.
Alternativ können Sie das folgende Skript verwenden, um den Beitrag der KI in Ihrer Codebasis zu berechnen, gemessen in Codezeilen (hinzugefügt, gelöscht und Gesamtänderungen).
#!/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"
Anwendungsbeispiel:
# 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
# }
# ]
# }
Ausgabefelder Beschreibung
Die JSON-Ausgabe enthält die folgenden Felder:
ai_percentage : (Zahl) Der Prozentsatz aller geänderten Zeilen (Summe der hinzugefügten und gelöschten Zeilen), die von KI-Autoren (identifiziert durch AI_MATCHER ) beigesteuert wurden.
ai_changes : (Objekt) Ein Objekt, das die aggregierten Zeilenänderungen ( added , deleted Zeilen und deren total ) der KI-Autoren detailliert beschreibt.
human_changes : (Objekt) Ein Objekt, das die aggregierten Zeilenänderungen ( added , deleted Zeilen und deren total ) detailliert beschreibt, die von menschlichen Autoren vorgenommen wurden.
details : (Objekt-Array) Bietet eine detaillierte Aufschlüsselung der Änderungen. Jedes Objekt im Array stellt den Beitrag eines bestimmten author zu einem bestimmten fileName dar, einschließlich added und deleted Zeilen sowie der total der Änderungen, die dieser Autor an dieser Datei vorgenommen hat.