Messages de Commit Git Propulsés par l'IA

Home PDF Audio

Ce script Python doit être placé dans un répertoire inclus dans le PATH de votre système, comme ~/bin.

import subprocess
import os
from openai import OpenAI
from dotenv import load_dotenv
import argparse

load_dotenv()

def gitmessageai(push=True, only_message=False):
    # Stage tous les changements
    subprocess.run(["git", "add", "-A"], check=True)

    # Obtenir le diff des changements stagés
    diff_process = subprocess.run(["git", "diff", "--staged"], capture_output=True, text=True, check=True)
    diff = diff_process.stdout

    if not diff:
        print("Aucun changement à committer.")
        return

    # Préparer le prompt pour l'IA
    prompt = f"""
Génère un message de commit concis au format Conventional Commits pour les changements de code suivants.
Utilise l'un des types suivants : feat, fix, docs, style, refactor, test, chore, perf, ci, build, ou revert.
Si applicable, inclut une portée entre parenthèses pour décrire la partie du codebase affectée.
Le message de commit ne doit pas dépasser 70 caractères.

Changements de code :
{diff}

Message de commit :
"""    

    # Envoyer le prompt à l'API DeepSeek
    api_key = os.environ.get("DEEPSEEK_API_KEY")
    if not api_key:
        print("Erreur : La variable d'environnement DEEPSEEK_API_KEY n'est pas définie.")
        return
    
    client = OpenAI(api_key=api_key, base_url="https://api.deepseek.com")


    try:
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=[
                {"role": "user", "content": prompt}
            ],
            max_tokens=100
        )
        if response and response.choices:
            commit_message = response.choices[0].message.content.strip()
            commit_message = commit_message.replace('`', '')
        else:
            print("Erreur : Aucune réponse de l'API.")
            return
    except Exception as e:
        print(f"Erreur lors de l'appel à l'API : {e}")
        return

    # Vérifier si le message de commit est vide
    if not commit_message:
        print("Erreur : Message de commit vide généré. Abandon du commit.")
        return
    
    if only_message:
        print(f"Message de commit suggéré : {commit_message}")
        return

    # Committer avec le message généré
    subprocess.run(["git", "commit", "-m", commit_message], check=True)

    # Pousser les changements
    if push:
        subprocess.run(["git", "push"], check=True)
    else:
        print("Changements commités localement, mais non poussés.")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Génère un message de commit avec l'IA et committe les changements.")
    parser.add_argument('--no-push', dest='push', action='store_false', help='Commite les changements localement sans les pousser.')
    parser.add_argument('--only-message', dest='only_message', action='store_true', help='Affiche uniquement le message de commit généré par l\'IA.')
    args = parser.parse_args()
    gitmessageai(push=args.push, only_message=args.only_message)

Ensuite, dans votre fichier ~/.zprofile, ajoutez ce qui suit :

alias gpa='python ~/bin/gitmessageai.py'
alias gca='python ~/bin/gitmessageai.py --no-push'
alias gm='python ~/bin/gitmessageai.py --only-message'

Back 2025.01.18 Donate