Git псевдоним с ошибками скрипта bash при изменении переменной - PullRequest
0 голосов
/ 09 января 2019

Имя моей ветки git:

feature/ACD-1706_new-api-call
Если я запускаю этот скрипт в консоли, он работает правильно:
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"'
Он выводит меня в подсказке, которая помогает автоматически генерировать сообщение фиксации на основе имени ветви функции.
> 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:

> 

Но если я превращу его в псевдоним git, скрипт выдаст ошибку.

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

Ответы [ 3 ]

0 голосов
/ 09 января 2019

Другое решение. Это не использует псевдонимы, а просто использует скрипт.

Создайте на своем пути файл с именем git-auto-message (без расширения!) Со следующим содержимым:

#!/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

Сделать скрипт исполняемым.

Тогда вы можете позвонить git auto-message. Git понимает, что у него нет внутренней команды с именем auto-message и что псевдоним с таким именем отсутствует. Поэтому он ищет путь к исполняемому файлу с именем git-auto-message. Таким образом, скрипт выполняется.

В то время как псевдонимы хороши для небольших вещей, эта функция позволяет создавать довольно сложные функции.


Обновлен скрипт, как я пропустил, что вы хотите добавить дополнительный текст.

0 голосов
/ 09 января 2019

Использование опции git commit -e будет гораздо проще, если вы просто захотите заполнить сообщение коммита начальным текстом. Это также позволяет пользователю использовать свой текстовый редактор по своему выбору, вместо того, чтобы навязывать им readline.

git commit -em "$(git rev-parse --abbrev-ref HEAD | sed 's|.*/||; s|_.*$||;' )"

(Один недостаток заключается в том, что он начинается с временного файла, содержащего аргумент -m, поэтому простого выхода из редактора без сохранения недостаточно для прерывания фиксации. Для этого необходимо явно сохранить пустой файл. )

Тогда гораздо проще правильно процитировать:

auto-message = !git commit -em "$(git rev-parse --abbrev-ref HEAD | sed 's|.*/||; s|_.*$||;')"
0 голосов
/ 09 января 2019

Это, безусловно, тот случай, когда вам нужно экранировать правильный символ здесь или там.

Я предлагаю более простое решение, также предложенное @ user7369280 в то же время, когда я разместил оригинальную версию этого ответа: создайте файл git-auto-message где-нибудь в вашей переменной PATH со следующим содержимым:

#!/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"

Сделать этот файл исполняемым

chmod 755 /path/to/git-auto-message

А потом

git auto-message

будет запускать этот скрипт с тем же поведением, что и в исходной командной строке.

Я просто работал над устранением неполадок с вашим настоящим псевдонимом и обнаружил, что синтаксис псевдонима git не любит иметь следующие символы: #, >, |.

Этот вариант работает, но теряет некоторые из ваших функций:

  • Не удаляет путь в начале имени ветви. Я не нашел способа поиска строки до / с использованием синтаксиса bash, который допускают псевдонимы git.
  • Используется - вместо | для отделения имени ветви от остальной части коммита.
  • Для приглашения используется $ вместо >.

Пересмотренный псевдоним:

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"'
...