Git + IA : automatiser ses commits et reviews
Vous codez pendant 3 heures. Vous faites un commit avec le message "fix stuff". Deux semaines plus tard, vous cherchez quand vous avez cassé l'authentification. Bonne chance avec votre historique git.
Ce scénario, tout développeur l'a vécu. Et c'est exactement le genre de problème que l'IA résout parfaitement : les tâches répétitives, importantes, mais que personne ne fait correctement parce que c'est ennuyeux.
Dans ce guide, on va transformer votre workflow Git avec l'IA : commits automatiques avec messages intelligents, code reviews par agent, et une discipline git irréprochable — sans effort.
🤯 Le problème : pourquoi git est mal utilisé
Soyons honnêtes. La majorité des développeurs :
| Mauvaise habitude | Conséquence |
|---|---|
git commit -m "fix" |
Historique illisible |
| Commits de 500 lignes | Impossible à reviewer |
| Pas de commit pendant 3 jours | Perte de travail potentielle |
| Pas de review avant merge | Bugs en production |
| Oubli de push | "Mais c'était sur mon PC !" |
.env dans le repo |
Fuite de secrets |
Ce n'est pas de la paresse — c'est humain. Les messages de commit, les reviews, la discipline... ce sont des tâches à faible gratification immédiate. Le cerveau humain les évite naturellement.
L'IA, elle, ne trouve rien ennuyeux.
🏷️ Pre-commit hooks avec IA
Qu'est-ce qu'un pre-commit hook ?
Un hook git est un script qui s'exécute automatiquement à certaines étapes. Le pre-commit hook tourne avant chaque commit. Si le script échoue (exit code ≠ 0), le commit est bloqué.
# Voir les hooks disponibles
ls .git/hooks/
# Les hooks sont des scripts avec un nom précis
# pre-commit, pre-push, commit-msg, etc.
Hook 1 : Message de commit automatique
Au lieu d'écrire vos messages de commit, laissez l'IA le faire :
#!/bin/bash
# .git/hooks/prepare-commit-msg
# Génère un message de commit intelligent à partir du diff
COMMIT_MSG_FILE=$1
COMMIT_SOURCE=$2
# Ne pas modifier les merge commits ou les amend
if [ "$COMMIT_SOURCE" = "merge" ] || [ "$COMMIT_SOURCE" = "squash" ]; then
exit 0
fi
# Récupérer le diff staged
DIFF=$(git diff --cached --stat)
DIFF_CONTENT=$(git diff --cached -- . ':!*.lock' ':!package-lock.json' | head -200)
if [ -z "$DIFF" ]; then
exit 0
fi
# Générer le message avec l'IA (via API)
MESSAGE=$(curl -s https://openrouter.ai/api/v1/chat/completions \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"model\": \"anthropic/claude-sonnet-4\",
\"messages\": [{
\"role\": \"user\",
\"content\": \"Generate a concise git commit message (max 72 chars for title, optional body) for this diff. Use conventional commits format (feat/fix/docs/refactor/chore). Be specific. Respond with ONLY the commit message, nothing else.\n\nFiles changed:\n${DIFF}\n\nDiff:\n${DIFF_CONTENT}\"
}],
\"max_tokens\": 200
}" | jq -r '.choices[0].message.content')
if [ -n "$MESSAGE" ] && [ "$MESSAGE" != "null" ]; then
echo "$MESSAGE" > "$COMMIT_MSG_FILE"
fi
Résultat : au lieu de taper git commit -m "fix login", vous faites juste git commit et l'IA écrit :
fix(auth): handle expired JWT tokens in middleware
- Add token expiry check before route handler
- Return 401 with clear error message
- Add unit test for expired token scenario
Hook 2 : Lint et vérifications automatiques
#!/bin/bash
# .git/hooks/pre-commit
# Vérifie le code avant de committer
set -e
echo "🔍 Pre-commit checks..."
# 1. Pas de secrets dans le code
echo " Checking for secrets..."
if git diff --cached --diff-filter=ACM | grep -iE "(api_key|password|secret|token)\s*=\s*[\"'][^\"']+[\"']" | grep -v "example\|placeholder\|xxx\|your_"; then
echo "❌ ERREUR: Possible secret détecté dans le code!"
echo " Utilisez des variables d'environnement (.env)"
exit 1
fi
# 2. Pas de fichiers sensibles
SENSITIVE_FILES=(".env" "id_rsa" ".pem" "credentials.json")
for pattern in "${SENSITIVE_FILES[@]}"; do
if git diff --cached --name-only | grep -q "$pattern"; then
echo "❌ ERREUR: Fichier sensible détecté: $pattern"
echo " Ajoutez-le à .gitignore"
exit 1
fi
done
# 3. Pas de console.log / print de debug
if git diff --cached --diff-filter=ACM -- "*.py" | grep -E "^\+" | grep -q "print("; then
echo "⚠️ WARNING: print() détecté. Debug oublié ?"
fi
if git diff --cached --diff-filter=ACM -- "*.js" "*.ts" | grep -E "^\+" | grep -q "console.log"; then
echo "⚠️ WARNING: console.log détecté. Debug oublié ?"
fi
# 4. Fichiers trop gros
MAX_SIZE=1048576 # 1MB
for file in $(git diff --cached --name-only --diff-filter=ACM); do
if [ -f "$file" ]; then
SIZE=$(wc -c < "$file")
if [ "$SIZE" -gt "$MAX_SIZE" ]; then
echo "❌ ERREUR: $file fait $(($SIZE/1024))KB (max 1MB)"
exit 1
fi
fi
done
echo "✅ Toutes les vérifications passées"
Installation des hooks
# Rendre les hooks exécutables
chmod +x .git/hooks/pre-commit
chmod +x .git/hooks/prepare-commit-msg
# Pour partager les hooks avec l'équipe
mkdir -p .githooks
cp .git/hooks/pre-commit .githooks/
cp .git/hooks/prepare-commit-msg .githooks/
# Configurer git pour utiliser le dossier partagé
git config core.hooksPath .githooks
🔎 Code review automatique par agent
Le concept
Avant chaque merge (ou même chaque push), un agent IA review le code et signale :
- Les bugs potentiels
- Les problèmes de sécurité
- Les améliorations possibles
- Les incohérences avec le style du projet
Script de review automatique
#!/bin/bash
# /root/scripts/ai-code-review.sh
# Lance une review IA sur les derniers changements
BRANCH=${1:-$(git branch --show-current)}
BASE=${2:-main}
echo "🔍 AI Code Review: $BRANCH vs $BASE"
echo "=================================="
# Récupérer le diff
DIFF=$(git diff "$BASE"..."$BRANCH" -- . ':!*.lock' ':!*.min.*' ':!dist/' | head -500)
if [ -z "$DIFF" ]; then
echo "Aucun changement à reviewer."
exit 0
fi
# Fichiers modifiés
FILES=$(git diff --name-only "$BASE"..."$BRANCH")
echo "Fichiers modifiés :"
echo "$FILES"
echo ""
# Review via API
REVIEW=$(curl -s https://openrouter.ai/api/v1/chat/completions \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"model\": \"anthropic/claude-sonnet-4\",
\"messages\": [{
\"role\": \"user\",
\"content\": \"Review this code diff. Focus on:\n1. Bugs and logical errors\n2. Security issues\n3. Performance concerns\n4. Code quality\n\nBe specific. Reference line numbers. If the code looks good, say so briefly.\n\nFiles: ${FILES}\n\nDiff:\n${DIFF}\"
}],
\"max_tokens\": 1000
}" | jq -r '.choices[0].message.content')
echo "$REVIEW"
Intégrer la review au workflow
# Option 1 : Hook pre-push
#!/bin/bash
# .git/hooks/pre-push
echo "🤖 Running AI code review before push..."
/root/scripts/ai-code-review.sh
echo ""
echo "Push will continue in 5 seconds. Ctrl+C to cancel."
sleep 5
# Option 2 : Alias git
git config --global alias.review '!/bin/bash /root/scripts/ai-code-review.sh'
# Utilisation : git review
# Ou : git review feature-branch main
Review avec OpenClaw
Si vous utilisez OpenClaw, vous pouvez demander une review directement :
# Dans Telegram, envoyez simplement :
Review le code dans /root/projects/mon-app,
compare la branche feature/auth avec main
L'agent va :
1. Examiner le diff
2. Lire le contexte du projet (README, tests existants)
3. Fournir une review détaillée
4. Suggérer des améliorations concrètes
C'est plus puissant qu'un script car l'agent comprend le contexte complet du projet.
🔄 Git discipline : l'agent qui commit pour vous
Le problème de la discipline
La meilleure pratique git est de faire des petits commits fréquents. En pratique, personne ne le fait parce qu'interrompre son flow pour committer est pénible.
Solution : un agent qui commit automatiquement après chaque session de travail.
Configuration avec OpenClaw
Ajoutez à votre heartbeat ou comme instruction permanente :
## 🤖 Git Auto-Commit
Après chaque session de travail sur un projet git :
1. `git status` pour voir les changements
2. Si des fichiers sont modifiés :
a. Grouper les changements par logique (pas tout dans un seul commit)
b. Pour chaque groupe : `git add` les fichiers concernés, puis `git commit` avec un message descriptif
c. `git push` si on est sur une branche avec remote
3. Ne JAMAIS commit : .env, credentials, fichiers temporaires, node_modules
### Conventions de commit
- feat: nouvelle fonctionnalité
- fix: correction de bug
- docs: documentation
- refactor: restructuration sans changement fonctionnel
- chore: maintenance, dépendances
- test: ajout/modification de tests
Script d'auto-commit intelligent
#!/bin/bash
# /root/scripts/smart-commit.sh
# Commit intelligent : groupe les changements par type
cd "$1" || exit 1
# Vérifier qu'on est dans un repo git
if ! git rev-parse --is-inside-work-tree &>/dev/null; then
echo "Pas un repo git"
exit 1
fi
# Vérifier qu'il y a des changements
if git diff --quiet && git diff --cached --quiet; then
echo "Rien à committer"
exit 0
fi
# Séparer par type de fichier
DOCS=$(git diff --name-only | grep -E "\.(md|txt|rst|doc)$")
PYTHON=$(git diff --name-only | grep -E "\.py$")
JS=$(git diff --name-only | grep -E "\.(js|ts|jsx|tsx)$")
CONFIG=$(git diff --name-only | grep -E "\.(yml|yaml|json|toml|ini|cfg)$")
OTHER=$(git diff --name-only | grep -vE "\.(md|txt|rst|doc|py|js|ts|jsx|tsx|yml|yaml|json|toml|ini|cfg)$")
# Committer chaque groupe
commit_group() {
local files="$1"
local prefix="$2"
if [ -n "$files" ]; then
echo "$files" | xargs git add
COUNT=$(echo "$files" | wc -l)
git commit -m "${prefix}: update ${COUNT} file(s)"
fi
}
commit_group "$DOCS" "docs"
commit_group "$PYTHON" "chore(python)"
commit_group "$JS" "chore(js)"
commit_group "$CONFIG" "chore(config)"
commit_group "$OTHER" "chore"
echo "✅ Smart commit terminé"
git log --oneline -5
🧰 Les outils : comparatif
GitHub Copilot
Pour aller plus loin sur ce sujet, consultez notre guide Cron + IA : automatiser des tâches intelligentes 24/7.
| Aspect | Détail |
|---|---|
| Fonction | Autocomplétion de code en temps réel |
| Git integration | Suggestions de messages de commit dans VS Code |
| Prix | $10/mois (Individual), $19/mois (Business) |
| Forces | Intégré à l'IDE, rapide, contextuel |
| Limites | Pas de review complète, pas d'automation git |
Pour aller plus loin sur ce sujet, consultez notre guide Générer du contenu automatiquement avec l'IA.
Claude Code (Anthropic)
| Aspect | Détail |
|---|---|
| Fonction | Agent de coding complet en CLI |
| Git integration | Peut lire, modifier, committer, créer des branches |
| Prix | Via API Anthropic ou OpenRouter |
| Forces | Comprend le projet entier, peut refactorer, tester |
| Limites | CLI uniquement, pas d'IDE intégré |
# Exemple avec Claude Code
claude "Review the last 3 commits and suggest improvements"
claude "Create a feature branch for user authentication"
claude "Write unit tests for the auth module and commit them"
OpenClaw Git Integration
| Aspect | Détail |
|---|---|
| Fonction | Agent IA persistant avec accès git natif |
| Git integration | Commit automatique, review, monitoring de repos |
| Prix | Self-hosted (gratuit) + coût LLM |
| Forces | Automation complète, fonctionne en autonome, alertes Telegram |
| Limites | Requiert un serveur |
OpenClaw peut surveiller un repo et agir automatiquement :
# Instruction pour l'agent OpenClaw
## 🛡️ Git Guardian
Toutes les heures, vérifie les repos dans /root/projects/ :
1. Pour chaque repo avec des changements non commités :
- Review les changements
- Commit avec un message approprié
- Push si la branche a un remote
2. Pour chaque repo avec des PRs ouvertes :
- Review le diff
- Poster un commentaire si des problèmes sont trouvés
Tableau comparatif
| Fonctionnalité | Copilot | Claude Code | OpenClaw |
|---|---|---|---|
| Messages de commit auto | ✅ (VS Code) | ✅ | ✅ |
| Code review complète | ❌ | ✅ | ✅ |
| Auto-commit périodique | ❌ | ❌ | ✅ |
| Alertes sur anomalies | ❌ | ❌ | ✅ |
| Fonctionne sans IDE | ❌ | ✅ | ✅ |
| Multi-repos | ❌ | ❌ | ✅ |
| Gratuit / self-hosted | ❌ | ❌ | ✅ |
📝 Exemples pratiques en situation réelle
Exemple 1 : Refactoring assisté par IA + git
Vous avez un fichier utils.py de 500 lignes qui fait tout. L'IA peut le refactorer et committer proprement :
# 1. Créer une branche de refactoring
git checkout -b refactor/split-utils
# 2. Demander à l'agent (via OpenClaw ou Claude Code)
# "Refactore utils.py en modules séparés :
# string_utils.py, file_utils.py, date_utils.py.
# Mets à jour tous les imports dans le projet."
# 3. L'agent produit des commits séparés :
# commit 1: refactor: extract string_utils from utils.py
# commit 2: refactor: extract file_utils from utils.py
# commit 3: refactor: extract date_utils from utils.py
# commit 4: refactor: update all imports across project
# commit 5: test: verify all modules after split
# 4. Vérifier le résultat
git log --oneline refactor/split-utils
# a1b2c3d test: verify all modules after split
# e4f5g6h refactor: update all imports across project
# i7j8k9l refactor: extract date_utils from utils.py
# m0n1o2p refactor: extract file_utils from utils.py
# q3r4s5t refactor: extract string_utils from utils.py
Chaque commit est atomique, reviewable, et réversible individuellement.
Exemple 2 : Changelog automatique
Générez un changelog à partir de l'historique git :
#!/usr/bin/env python3
"""Génère un changelog à partir des commits git, enrichi par l'IA."""
import subprocess
import json
from openai import OpenAI
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="sk-or-..."
)
def get_commits_since(tag: str) -> list[dict]:
"""Récupère les commits depuis un tag donné."""
result = subprocess.run(
["git", "log", f"{tag}..HEAD", "--pretty=format:%H|%s|%an|%ai"],
capture_output=True, text=True
)
commits = []
for line in result.stdout.strip().split("\n"):
if line:
parts = line.split("|", 3)
commits.append({
"hash": parts[0][:7],
"message": parts[1],
"author": parts[2],
"date": parts[3][:10]
})
return commits
def generate_changelog(commits: list[dict], version: str) -> str:
"""Utilise l'IA pour générer un changelog lisible."""
commit_list = "\n".join(
f"- {c['hash']} {c['message']} ({c['author']})" for c in commits
)
response = client.chat.completions.create(
model="anthropic/claude-sonnet-4",
messages=[{
"role": "user",
"content": f"""Génère un changelog professionnel en Markdown
pour la version {version}.
Commits :
{commit_list}
Organise par catégories :
## 🚀 Nouvelles fonctionnalités
## 🐛 Corrections de bugs
## 🔧 Améliorations
## 📚 Documentation
## 🏗️ Maintenance
Ignore les commits de merge. Rends les descriptions claires
pour un utilisateur final (pas un développeur)."""
}],
max_tokens=1000
)
return response.choices[0].message.content
# Utilisation
commits = get_commits_since("v1.2.0")
changelog = generate_changelog(commits, "v1.3.0")
with open("CHANGELOG.md", "a") as f:
f.write(f"\n\n{changelog}")
print(changelog)
Exemple 3 : PR description automatique
Quand vous créez une PR, l'IA génère la description :
#!/bin/bash
# generate-pr-description.sh
# Génère une description de PR à partir du diff avec main
BRANCH=$(git branch --show-current)
DIFF=$(git diff main..."$BRANCH" --stat)
DIFF_CONTENT=$(git diff main..."$BRANCH" -- . ':!*.lock' | head -300)
COMMITS=$(git log main..."$BRANCH" --pretty=format:"- %s" | head -20)
DESCRIPTION=$(curl -s https://openrouter.ai/api/v1/chat/completions \
-H "Authorization: Bearer $OPENROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d "{
\"model\": \"anthropic/claude-sonnet-4\",
\"messages\": [{
\"role\": \"user\",
\"content\": \"Generate a GitHub PR description in Markdown.\n\nBranch: $BRANCH\n\nCommits:\n$COMMITS\n\nFiles changed:\n$DIFF\n\nDiff (partial):\n$DIFF_CONTENT\n\nInclude:\n## Summary\n## Changes\n## Testing\n## Screenshots (if applicable)\n\nBe concise and specific.\"
}],
\"max_tokens\": 800
}" | jq -r '.choices[0].message.content')
echo "$DESCRIPTION"
# Copier dans le presse-papier (si xclip est installé)
echo "$DESCRIPTION" | xclip -selection clipboard 2>/dev/null && echo "📋 Copié dans le presse-papier !"
Exemple 4 : Détection de régressions dans le diff
Avant un merge, vérifiez automatiquement les régressions potentielles :
#!/usr/bin/env python3
"""Détecte les régressions potentielles dans un diff git."""
import subprocess
from openai import OpenAI
client = OpenAI(
base_url="https://openrouter.ai/api/v1",
api_key="sk-or-..."
)
def check_regressions(base: str = "main") -> dict:
branch = subprocess.run(
["git", "branch", "--show-current"],
capture_output=True, text=True
).stdout.strip()
# Récupérer uniquement les fichiers modifiés (pas les ajouts)
modified = subprocess.run(
["git", "diff", "--name-only", "--diff-filter=M", f"{base}...{branch}"],
capture_output=True, text=True
).stdout.strip()
if not modified:
return {"regressions": [], "risk": "none"}
diff = subprocess.run(
["git", "diff", f"{base}...{branch}", "--", *modified.split("\n")],
capture_output=True, text=True
).stdout[:3000]
response = client.chat.completions.create(
model="anthropic/claude-sonnet-4",
messages=[{
"role": "user",
"content": f"""Analyse ce diff git et identifie les régressions potentielles.
Fichiers modifiés : {modified}
Diff :
{diff}
Retourne un JSON :
{{
"regressions": [
{{
"file": "nom_du_fichier",
"line": "numéro approximatif",
"description": "description du risque",
"severity": "low|medium|high"
}}
],
"risk": "none|low|medium|high",
"summary": "résumé en 1 phrase"
}}
Cherche : suppressions de validations, catch trop larges,
timeouts supprimés, logs retirés, conditions inversées, etc."""
}],
max_tokens=800
)
import json
return json.loads(response.choices[0].message.content)
result = check_regressions()
if result["risk"] in ["medium", "high"]:
print(f"⚠️ Risque de régression : {result['summary']}")
for r in result["regressions"]:
print(f" [{r['severity']}] {r['file']}:{r['line']} — {r['description']}")
else:
print("✅ Aucune régression détectée")
🔒 Sécurité Git et IA
Ne jamais exposer de secrets
L'IA lit votre code. Assurez-vous qu'elle ne lit pas vos secrets :
# .gitignore essentiel
.env
.env.local
.env.production
*.pem
*.key
id_rsa*
credentials.json
service-account.json
# Vérifier l'historique pour des secrets déjà commités
git log --all --full-history -p | grep -iE "(api_key|password|secret)" | head -20
# Si un secret a été commité, il est dans l'historique POUR TOUJOURS
# Solution : git-filter-repo (ne pas utiliser filter-branch)
pip install git-filter-repo
git filter-repo --path-glob '*.env' --invert-paths
Fichier .gitleaks.toml
# .gitleaks.toml - Configuration de détection de secrets
title = "Gitleaks config"
[[rules]]
id = "generic-api-key"
description = "Generic API Key"
regex = '''(?i)(api_key|apikey|api-key)\s*[=:]\s*["']\S{20,}["']\s*'''
tags = ["key", "API"]
[[rules]]
id = "generic-secret"
description = "Generic Secret"
regex = '''(?i)(secret|password|passwd|pwd)\s*[=:]\s*["']\S{8,}["']\s*'''
tags = ["secret"]
[allowlist]
description = "Allowlisted files"
paths = [
'''(.*?)(test|spec|example)(.*?)''',
'''\.md$'''
]
📋 Workflow complet recommandé
Voici le workflow Git + IA optimal :
1. Vous codez normalement
↓
2. Pre-commit hook vérifie :
- Pas de secrets ✓
- Pas de fichiers interdits ✓
- Pas de debug oublié ✓
↓
3. IA génère le message de commit
"fix(auth): handle token expiry in middleware"
↓
4. Vous validez (ou modifiez) le message
↓
5. Pre-push hook lance une review IA
"⚠️ Possible SQL injection line 42"
↓
6. Vous corrigez si nécessaire
↓
7. Push ✅
↓
8. OpenClaw vérifie périodiquement
qu'il n'y a pas de travail non commité
Installation express
# 1. Créer le dossier de hooks partagés
mkdir -p ~/.git-hooks
# 2. Copier les hooks (depuis ce guide)
# pre-commit, prepare-commit-msg, pre-push
# 3. Configurer git globalement
git config --global core.hooksPath ~/.git-hooks
# 4. Installer les outils
pip install gitleaks # Détection de secrets
# 5. Définir la clé API (pour les messages IA)
echo 'export OPENROUTER_API_KEY="votre_clé"' >> ~/.bashrc
source ~/.bashrc
| Composant | Fonction | Temps d'install |
|---|---|---|
| Pre-commit hook | Sécurité + lint | 2 min |
| Prepare-commit-msg | Messages IA | 3 min |
| Pre-push review | Code review | 3 min |
| Smart-commit script | Auto-commit | 2 min |
| Total | Workflow complet | 10 min |
💡 Tips et bonnes pratiques
-
Commencez petit : installez juste le message de commit auto, puis ajoutez les autres hooks progressivement
-
Gardez le contrôle : l'IA suggère, vous validez. Ne faites jamais de
--no-verifypar habitude -
Personnalisez les prompts : adaptez les instructions IA au style de votre projet
-
Versionnez vos hooks : mettez-les dans
.githooks/dans le repo pour que toute l'équipe en profite -
Combinez avec le monitoring : utilisez le monitoring IA pour surveiller que vos repos sont bien maintenus
📚 Articles liés
- Qu'est-ce qu'OpenClaw ? — L'agent IA qui peut gérer votre git automatiquement
- Automatiser sa vie numérique avec l'IA — Git n'est qu'un début
- Claude Anthropic — Le modèle derrière Claude Code
- OpenRouter : accéder à tous les LLMs — Pour les appels API dans vos hooks
- Monitoring serveur avec l'IA — Surveillez aussi vos serveurs
- Docker + IA : conteneuriser ses services — Déployer vos projets git automatiquement
- Sécuriser son serveur OpenClaw — La sécurité côté serveur