Aller au contenu

Messages automatisés de commit Git

AI generated translation.

In the world of software development, making consistent and informative commit messages is crucial but often overlooked. This task can become tedious, especially when you are in the flow of coding. To help with this, we’ve crafted a script conçu pour automatiser la génération de messages de commit Git, ensuring they are meaningful and save you time.

Le script fonctionne comme un script d’automatisation standard pour Node.js et utilise runPrompt pour effectuer des appels au LLM et demander à l’utilisateur de confirmer le texte généré.

Tout d’abord, nous vérifions s’il y a des modifications en préparation dans le dépôt Git :

let { stdout } = await host.exec("git", ["diff", "--cached"])

Si aucune modification n’est en préparation, nous demandons à l’utilisateur s’il souhaite préparer toutes les modifications. Si l’utilisateur confirme, nous préparons toutes les modifications. Sinon, nous arrêtons le processus.

const stage = await host.confirm("No staged changes. Stage all changes?", {
default: true,
})
if (stage) {
await host.exec("git", ["add", "."])
stdout = (await host.exec("git", ["diff", "--cached"])).stdout
}
if (!stdout) cancel("no staged changes")

Nous générons un message de commit initial à l’aide des modifications en préparation :

message = (
await runPrompt(
(_) => {
_.def("GIT_DIFF", stdout, { maxTokens: 20000 })
_.$`GIT_DIFF is a diff of all staged changes, coming from the command:
\`\`\`
git diff --cached
\`\`\`
Please generate a concise, one-line commit message for these changes.
- do NOT add quotes`
},
{ cache: false, temperature: 0.8 }
)
).text

La configuration du prompt ci-dessus indique que le message doit être concis, en rapport avec la sortie de la commande “git diff —cached”, et qu’il ne doit pas inclure de guillemets.

L’utilisateur choisit comment procéder avec le message généré :

choice = await host.select(
message,
[{ name: "commit", value: "commit", description: "accept message and commit" },
...],
)

Des options sont proposées pour modifier ou régénérer le message. Si l’utilisateur choisit de modifier le message, nous lui demandons d’entrer un nouveau message :

if (choice === "edit") {
message = await host.input("Edit commit message", { required: true })
choice = "commit"
}

Si l’utilisateur décide de valider le message, nous effectuons le commit des modifications :

if (choice === "commit" && message) {
console.log((await host.exec("git", ["commit", "-m", message])).stdout)
}

Vous pouvez exécuter ce script en utilisant le CLI.

Fenêtre de terminal
genaiscript run gcm

Vous pouvez encapsuler cette commande dans un fichier gcm.sh ou dans la section script de votre fichier package.json :

{
"devDependencies": {
"genaiscript": "*"
},
"scripts": {
"gcm": "genaiscript run gcm"
}
}

Ensuite, vous pouvez exécuter le script en utilisant :

Fenêtre de terminal
npm run gcm

Vous pouvez également utiliser le hook Git commit-msg pour exécuter la génération de messages à la demande. En utilisant le framework husky, nous pouvons enregistrer l’exécution de genaiscript dans le fichier .husky/commit-msg.

Le hook commit-msg reçoit une localisation de fichier où le message est stocké. Nous passons ce paramètre au script afin qu’il soit renseigné dans la variable env.files.

.husky/commit-msg
genaiscript run commit-msg "$1"

Dans le script, nous vérifions si le contenu du fichier contient déjà un message utilisateur, sinon un nouveau message est généré.

commit-msg.genai.mts
const msg = env.files[0] // file created by git to hold the message
const msgContent = msg.content // check if the user added any message
?.split(/\n/g)
.filter((l) => l && !/^#/.test(l)) // filter out comments
.join("\n")
if (msgContent) cancel("commit message already exists")
...
await host.writeText(msg.filename, message)

Ce script a été inspiré par le générateur de messages de commit de Karpathy commit message generator.