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"