Как установить все bash аргументов, кроме первых двух, в git псевдоним - PullRequest
1 голос
/ 25 марта 2020

Я хочу создать псевдоним git, который создаст сообщение коммита с определенным мной шаблоном.

Это шаблон:

"[$ firstVariable] $ secondVariable: $ thirdVariable "

  1. Первый - номер ветви ,
  2. , второй - тип коммита ,
  3. и последние аргументы являются темой сообщения фиксации

Например:

"[1000] feat: добавить новый контроллер продаж "

Это моя bash функция в .gitconfig файле:

[alias]
    c = "!f() { branchNumber=${1}; type=${2}; shift; shift; subject=${*}; git commit -m '['"$branchNumber"'] '"$type"': '"$subject"' '; }; f"

Я могу получить первые две переменные, но в третьей одна ошибка в терминале.

Если я выполню эту команду, я получу следующее:

Команда: $ git c 1000 feat add new sales controller

Возврат:

ошибка: pathspe c 'sales' не соответствует ни одному из файлов, известных git.

ошибка: pathspe c 'controller' не соответствует ни одному из файлов, известных git.


Observati ons:

  • Если я добавлю функцию эха в $subject, команда вернет:

новый контроллер продаж

ошибка: pathspe c 'sales' не соответствует ни одному из файлов, известных git.

ошибка: pathspe c 'controller' не соответствует ни одному из файлов, известных git.

  • Если я просто добавлю один аргумент в $subject, псевдоним будет работать

1 Ответ

2 голосов
/ 25 марта 2020

Git "съедает" один уровень двойных кавычек при разборе строки .gitconfig. Следовательно, в то время как вы написали:

"!f() { branchNumber=${1}; type=${2}; shift; shift; subject=${*}; git commit -m '['"$branchNumber"'] '"$type"': '"$subject"' '; }; f"

то, что видит shell :

!f() { branchNumber=${1}; type=${2}; shift; shift; subject=${*}; git commit -m '['$branchNumber'] '$type': '$subject' '; }; f

Обратите внимание, что единственные кавычки, которые остаются, это одиночные кавычки, так что когда $subject расширяется, это становится отдельными словами:

git c 1000 feat add new sales controller

становится:

git
commit
-m
[1000] feat: add
new
sales
controller 

(где я нарисовал каждое "слово" на линии отдельно). (Существует также пробел после слова controller, поскольку он был защищен одинарными кавычками.) Если вы предпочитаете, другой способ нарисовать это для целей публикации StackOverflow может быть:

git commit -m [1000] feat: add new sales controller

То есть сама команда видит каждое из них как одно отдельное «слово»: следовательно, сообщение журнала фиксации равно [1000] feat: add; new, sales и controller обрабатываются как pathspe c аргументов.

Одно простое лекарство - заменить каждую двойную кавычку, которую вы используете для sh preserve with backsla sh -double-quote:

    c = "!f() { branchNumber=${1}; type=${2}; shift; shift; subject=${*}; git commit -m '['\"$branchNumber\"'] '\"$type\"': '\"$subject\"' '; }; f"

Чтобы сделать это более читабельным, обратите внимание, что двойных кавычек достаточно для всего аргумента -m (и здесь скобки не требуются в разных местах) :

    c = "!f() { branchNumber=$1; type=$2; shift 2; subject=$*; git commit -m \"[$branchNumber] ${type}: $subject\"; }; f"
...