Alias et terminal
Il est possible de mettre en place des alias de commandes git en éditant soit ~/.gitconfig
soit .git/config
dans le dossier du projet
[alias] lg = log -20 --graph --oneline --decorate st = status co = checkout cm = commit -m p = pull --all info = "!git config --get remote.origin.url" [diff] algorithm = histogram
Afficher la branche courante dans le terminal
Pour afficher la branche courante dans le terminal, ajouter les lignes suivantes dans le fichier ~/.bashrc
:
parse_git_branch() { git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/ (\1)/' } export PS1="\[\033[1m\]\[\033[32m\]\u@\h\[\033[39m\]:\[\033[34m\]\w\[\033[33m\]\$(parse_git_branch)\[\033[00m\] $ "
Générer les messages de commit avec ChatGPT
Installer le package jq
sudo apt install jq
Puis ajouter la clé d'API OpenAI dans le fichier ~/.profile
export OPENAI_API_KEY="......"
Prendre en compte le fichier ~/.profile
source ~/.profile
Puis ajouter le contenu suivant dans un fichier ~/bin/cia
(Commit IA)
#!/bin/bash # Définition des couleurs RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' MAGENTA='\033[0;35m' CYAN='\033[0;36m' NC='\033[0m' # No Color # Définition du modèle par défaut MODEL=${1:-"gpt-4o-mini"} # Vérification de la présence de la clé API OpenAI dans les variables d'environnement if [ -z "$OPENAI_API_KEY" ]; then echo -e "${RED}Erreur: La variable d'environnement OPENAI_API_KEY n'est pas définie${NC}" exit 1 fi # Vérification qu'on est dans un repo git if ! git rev-parse --is-inside-work-tree > /dev/null 2>&1; then echo -e "${RED}Erreur: Vous n'êtes pas dans un dépôt Git${NC}" exit 1 fi # Limite maximale de tokens en fonction du modèle if [[ "$MODEL" == "gpt-4o-mini" ]]; then MAX_TOKENS=7500 else MAX_TOKENS=3500 fi # Récupération du git diff DIFF=$(git diff --staged) if [ -z "$DIFF" ]; then echo -e "${YELLOW}Aucun changement n'a été mis en staging. Utilisez 'git add' pour ajouter des fichiers.${NC}" exit 1 fi # Récupération du contexte du projet PROJECT_NAME=$(basename "$(git rev-parse --show-toplevel)") BRANCH=$(git branch --show-current) RECENT_COMMITS=$(git log -n 5 --pretty=format:"%s") FILES_CHANGED=$(git diff --staged --name-only | tr '\n' ', ') # Fonction pour estimer grossièrement le nombre de tokens (4 caractères ~ 1 token) estimate_tokens() { local text="$1" local char_count=${#text} echo $((char_count / 4)) } # Préparation du contexte SYSTEM_PROMPT="Tu es un assistant expert en Git, spécialisé dans la rédaction de messages de commit clairs, concis et structurés" USER_PROMPT_ANALYSIS="Analyse le diff suivant et produis une liste détaillée des modifications effectuées. Énumère chaque changement significatif sous forme de liste à puces. Voici le contexte du projet et le diff :" USER_PROMPT_COMMIT="À partir de la liste des modifications suivante, génère un message de commit en français, concis et descriptif. Respecte les conventions de Commit Convention (ex : feat, fix, chore, etc.). La première ligne ne doit pas dépasser 72 caractères sans indiquer le nom de fichier ou classe, suivie d'une ligne vide, puis d'une description succinte en liste à puces des modifications les plus pertinentes sans jamais indiquer les noms des fichiers ou les classes. Voici le contexte du projet et la liste des modifications :" PROJECT_CONTEXT="Nom du projet: $PROJECT_NAME\nBranche actuelle: $BRANCH\nFichiers modifiés: $FILES_CHANGED\nCommits récents:\n$RECENT_COMMITS" # Estimation des tokens actuels CURRENT_TOKENS=$(estimate_tokens "$SYSTEM_PROMPT$USER_PROMPT_ANALYSIS$PROJECT_CONTEXT$DIFF") # Vérifier si nous dépassons la limite de tokens if [ "$CURRENT_TOKENS" -gt "$MAX_TOKENS" ]; then echo -e "${YELLOW}Avertissement: Le diff est volumineux ($CURRENT_TOKENS tokens estimés), filtrage des fichiers binaires et ressources...${NC}" # Filtrer les fichiers ressources du diff (images, binaires, etc.) FILTERED_DIFF=$(echo "$DIFF" | grep -v "^diff --git .*(\.png\|\.jpg\|\.jpeg\|\.gif\|\.svg\|\.ico\|\.woff\|\.ttf\|\.eot\|\.pdf\|\.zip\|\.bin\|\.dat)") # Réestimer après filtrage FILTERED_TOKENS=$(estimate_tokens "$SYSTEM_PROMPT$USER_PROMPT$PROJECT_CONTEXT$FILTERED_DIFF") if [ "$FILTERED_TOKENS" -gt "$MAX_TOKENS" ]; then echo -e "${RED}Erreur: Même après filtrage, le diff est trop volumineux ($FILTERED_TOKENS tokens estimés).${NC}" echo -e "${YELLOW}Essayez de diviser votre commit en plusieurs commits plus petits.${NC}" exit 1 else echo -e "${GREEN}Diff filtré avec succès, continuation avec $FILTERED_TOKENS tokens.${NC}" DIFF="$FILTERED_DIFF" fi fi # Construction du JSON pour l'analyse des différences JSON_DATA_ANALYSIS=$(jq -n \ --arg system "$SYSTEM_PROMPT" \ --arg prompt "$USER_PROMPT_ANALYSIS" \ --arg project_context "$PROJECT_CONTEXT" \ --arg diff "$DIFF" \ --arg temperature "0.7" \ --arg model "$MODEL" ' { "model": $model, "messages": [ { "role": "system", "content": $system }, { "role": "user", "content": ($prompt + "\n\nContexte du projet:\n" + $project_context + "\n\nDiff:\n" + $diff) } ], "temperature": ($temperature | tonumber), "max_tokens": 1024 } ') # Appel à l'API OpenAI pour l'analyse echo -e "${BLUE}Analyse des modifications en cours...${NC}" RESPONSE_ANALYSIS=$(curl -s https://api.openai.com/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -d "$JSON_DATA_ANALYSIS") # Extraction de la liste des modifications MODIFICATIONS_LIST=$(echo $RESPONSE_ANALYSIS | jq -r '.choices[0].message.content' 2>/dev/null) if [ $? -ne 0 ] || [ -z "$MODIFICATIONS_LIST" ]; then echo -e "${RED}Erreur lors de l'analyse des modifications${NC}" echo -e "${YELLOW}Réponse de l'API:${NC} $RESPONSE_ANALYSIS" exit 1 fi echo -e "${GREEN}Analyse terminée!${NC}" # Construction du JSON pour la génération du message de commit JSON_DATA_COMMIT=$(jq -n \ --arg system "$SYSTEM_PROMPT" \ --arg prompt "$USER_PROMPT_COMMIT" \ --arg project_context "$PROJECT_CONTEXT" \ --arg modifications "$MODIFICATIONS_LIST" \ --arg temperature "0.7" \ --arg model "$MODEL" ' { "model": $model, "messages": [ { "role": "system", "content": $system }, { "role": "user", "content": ($prompt + "\n\nContexte du projet:\n" + $project_context + "\n\nListe des modifications:\n" + $modifications) } ], "temperature": ($temperature | tonumber), "max_tokens": 1024 } ') # Appel à l'API OpenAI pour le message de commit echo -e "${BLUE}Génération du message de commit...${NC}" RESPONSE_COMMIT=$(curl -s https://api.openai.com/v1/chat/completions \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $OPENAI_API_KEY" \ -d "$JSON_DATA_COMMIT") # Extraction du message de commit de la réponse JSON et suppression des triple backticks RAW_MESSAGE=$(echo $RESPONSE_COMMIT | jq -r '.choices[0].message.content' 2>/dev/null | sed 's/```\(\w*\)\?//g') # Suppression des lignes vides au début du message MESSAGE=$(echo "$RAW_MESSAGE" | sed '/./,$!d') if [ $? -ne 0 ] || [ -z "$MESSAGE" ]; then echo -e "${RED}Erreur lors de la génération du message de commit${NC}" echo -e "${YELLOW}Réponse de l'API:${NC} $RESPONSE_COMMIT" exit 1 fi # Affichage du message généré echo -e "${BLUE}Message de commit généré:${NC}" echo -e "${CYAN}------------------------${NC}" echo -e "" echo -n "$MESSAGE" echo -e "" echo -e "\n${CYAN}------------------------${NC}" # Demande de confirmation read -p "$(echo -e "${MAGENTA}Voulez-vous utiliser ce message pour votre commit? (o/N) ${NC}")" CONFIRM if [[ $CONFIRM =~ ^[oO]$ ]]; then git commit -m "$MESSAGE" echo -e "${GREEN}Commit effectué avec succès!${NC}" else echo -e "${YELLOW}Commit annulé. Vous pouvez modifier le message et faire le commit manuellement.${NC}" fi
Pour finir, rendez le fichier ~/bin/cia
exécutable :
chmod +x ~/bin/cia
A partir de là, il suffit d'ajouter les fichiers avec la commande git add
et lancer ensuite cia