Le nom de ma branche git:
> git auto-message bash -l -c 'current_branch=$(git rev-parse --abbrev-ref HEAD) && no_feature=${current_branch: -c: line 0: unexpected EOF while looking for matching `'' bash -l -c 'current_branch=$(git rev-parse --abbrev-ref HEAD) && no_feature=${current_branch: -c: line 1: syntax error: unexpected end of file
Si j'exécute ce script dans la console, cela fonctionne correctement:
auto-message = !bash -l -c 'current_branch="$(git rev-parse --abbrev-ref HEAD)" && no_feature=${current_branch##*/} && no_underscore=${no_feature%%_*} && history -s "git commit -m \"$no_underscore | " && echo "Press UP to start commit command:" && echo "" && read -e -p "> " && eval "$REPLY"'
Cela me laisse tomber dans une invite qui m'aide à générer automatiquement un message de validation basé sur le nom de la branche de fonctionnalité.
> bash -l -c 'current_branch="$(git rev-parse --abbrev-ref HEAD)" && no_feature=${current_branch##*/} && no_underscore=${no_feature%%_*} && history -s "git commit -m \"$no_underscore | " && echo "Press UP to start commit command:" && echo "" && read -e -p "> " && eval "$REPLY"' Press UP to start commit command: >
Mais si je le transforme en alias git, le script se trompe.
bash -l -c 'current_branch="$(git rev-parse --abbrev-ref HEAD)" && no_feature=${current_branch##*/} && no_underscore=${no_feature%%_*} && history -s "git commit -m \"$no_underscore | " && echo "Press UP to start commit command:" && echo "" && read -e -p "> " && eval "$REPLY"'
feature/ACD-1706_new-api-call
3 Réponses :
Il s'agit certainement de devoir échapper au bon caractère ici ou là.
Je suggère une solution plus simple, également suggérée par @ user7369280 en même temps que j'ai posté la version originale de cette réponse: créer un fichier git-auto-message
quelque part sur votre PATH avec ce contenu:
auto-message = !bash -l -c 'current_branch="$(git rev-parse --abbrev-ref HEAD)" && no_feature=${current_branch} && no_underscore=${no_feature%%_*} && history -s "git commit -m $no_underscore - " && echo "Press UP to start commit command:" && echo "" && read -e -p "_ " && eval "$REPLY"'
Rendre ce fichier exécutable
git auto-message
Et puis
chmod 755 /path/to/git-auto-message
exécutera ce script avec le même comportement que votre ligne de commande d'origine.
J'ai juste travaillé sur le dépannage de votre alias réel, et J'ai trouvé que la syntaxe de l'alias git n'aime pas avoir ces symboles: #
, >
, |
.
Cette variante fonctionne mais perd certaines de vos fonctionnalités:
/
en utilisant la syntaxe bash acceptée par les alias git. -
au lieu de |
pour séparer le nom de la branche du reste du commit. $
au lieu de >
pour l'invite. Alias révisé:
#!/bin/bash set -o errexit current_branch="$(git rev-parse --abbrev-ref HEAD)" no_feature=${current_branch##*/} no_underscore=${no_feature%%_*} history -s "git commit -m \"$no_underscore | " echo "Press UP to start commit command:" echo "" read -e -p "> " eval "$REPLY"
Une solution différente. Cela n'utilise pas d'alias, mais utilise simplement un script.
Créez un fichier dans votre chemin avec le nom git-auto-message
(sans extension!) Avec le contenu suivant: p >
#!/bin/bash #current_branch="feature/ACD-1706_new-api-call" current_branch="$(git rev-parse --abbrev-ref HEAD)" no_feature=${current_branch##*/} no_underscore=${no_feature%%_*} read -p "Complete commit message (empty cancels) \"$no_underscore | " msg echo # remove leading whitespaces msg="${msg#"${msg%%[![:space:]]*}"}" # remove trailing whitespaces msg="${msg%"${msg##*[![:space:]]}"}" if [ -n "$msg" ]; then git commit -m "$no_underscore | $msg" fi
Rendez le script exécutable.
Ensuite, vous pouvez appeler git auto-message
. Git se rend compte qu'il n'a pas de commande interne nommée auto-message
et qu'il n'y a pas d'alias avec ce nom. Il recherche donc dans le chemin un exécutable nommé git-auto-message
. Le script est donc exécuté.
Bien que les alias soient parfaits pour les petites choses, cette fonctionnalité permet de créer des fonctionnalités assez complexes.
Script mis à jour, comme je l'ai manqué, que vous souhaitez ajouter du texte supplémentaire.
Utiliser l'option -e
de git commit
serait beaucoup plus simple si vous voulez juste ensemencer le message de validation avec un texte initial. Il permet également à l'utilisateur d'utiliser l'éditeur de texte de son choix, plutôt que de lui imposer readline
.
auto-message = !git commit -em "$(git rev-parse --abbrev-ref HEAD | sed 's|.*/||; s|_.*$||;')"
(Un inconvénient est que cela commence par un fichier temporaire contenant l'argument -m
, donc quitter simplement l'éditeur sans enregistrer n'est pas suffisant pour abandonner un commit. Vous devez enregistrer explicitement un fichier vide pour ce faire.)
Il est alors beaucoup plus facile de citer correctement:
git commit -em "$(git rev-parse --abbrev-ref HEAD | sed 's|.*/||; s|_.*$||;' )"
Nitpick: $ {no_feature %% _ *}
supprime de la fin, donc le résultat des substitutions est ACD-1706
pour l'exemple; votre commande sed laisse à la place new-api-call
.
Belle solution simple. Je suggère d'ajouter s / $ / | /
à la fin de la commande sed
pour préserver le comportement complet de la question de l'OP. Si vous le faites, vous devez également ajouter \ "
en dehors des guillemets existants: auto-message =! Git commit -em \" "$ (git rev-parse --abbrev-ref HEAD | sed 's |. * / ||; s | _. * $ ||; s / $ / | /') "\"
Git mange une couche de barre oblique inverse de ses fichiers de configuration (et traite les doubles guillemets de manière intéressante), donc si la commande à envoyer à bash est, disons,
bash -c "echo \" hello \ ""
, vous besoin de définir le fichier de configuration pour lire:! bash -c \ "echo \\\" bonjour \\\ "\"