1
votes

Alias ​​Git avec erreurs de script bash lors de la modification de variable

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


1 commentaires

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 \\\ "\"


3 Réponses :


1
votes

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:

  • Il ne supprime pas le chemin au début du nom de la branche. Je n'ai pas trouvé de moyen de rechercher la chaîne jusqu'au / en utilisant la syntaxe bash acceptée par les alias git.
  • Il utilise - au lieu de | pour séparer le nom de la branche du reste du commit.
  • Il utilise $ 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"


0 commentaires

1
votes

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.


0 commentaires

2
votes

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|_.*$||;' )"


2 commentaires

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 / $ / | /') "\"