====== 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`