是否可以用单引号编写 git 别名函数?

问题描述 投票:0回答:2

我正在尝试编写一个带有单引号的 git 别名函数来重命名和提交名称中可能包含空格的文件,但它不起作用:

$ grep '^\s*mvv' ~/.gitconfig 
    mvv = '!f() { cd ${GIT_PREFIX:-.};git mv -v "$1" "$2";git commit -uno "$1" "$2" -m "Renamed $1 to $2"; }; f'
$ git mvv "9.1.3 Packet Tracer - Identify MAC and IP Addresses - ILM.pdf" 9.1.3_Packet_Tracer_-_Identify_MAC_and_IP_Addresses_-_ILM.pdf
fatal: bad alias.mvv string: unclosed quote
$ git config alias.mvv
'!f() { cd ${GIT_PREFIX:-.}

我也尝试过这个:

$ grep '^\s*mvv' ~/.gitconfig 
    mvv = !sh -c '{ cd ${GIT_PREFIX:-.};git mv -v "$1" "$2";git commit -uno "$1" "$2" -m "Renamed $1 to $2"; }'
$ git mvv "9.1.3 Packet Tracer - Identify MAC and IP Addresses - ILM.pdf" 9.1.3_Packet_Tracer_-_Identify_MAC_and_IP_Addresses_-_ILM.pdf
sh -c '{ cd ${GIT_PREFIX:-.}: 1: Syntax error: Unterminated quoted string
$ git config alias.mvv
!sh -c '{ cd ${GIT_PREFIX:-.}
$

但是当我运行它时,显示

fatal: bad alias.mvv string: unclosed quote
错误。

我希望它能发挥作用。

linux git git-config
2个回答
1
投票

简短的回答似乎是“不,使用双引号”。为了避免手动转义内部引号,可以要求 Git 进行转义:

git config alias.mvv '!f() { cd ${GIT_PREFIX:-.};git mv -v "$1" "$2";git commit -uno "$1" "$2" -m "Renamed $1 to $2"; }; f'

然后参见

.git/config
— Git 转义别名中的 shell 元字符。

PS。仅适用于 Unix/Linux 或类 Linux 环境(请阅读

git-bash
); AFAIK Windows 命令解释器不喜欢命令行中的撇号(单引号)。如果我说得不对,请有更了解的人纠正我。


1
投票

git help config
语法部分中用于在字符串值配置中引用的规则:

定义值的行可以通过以

\
结束来继续到下一行;反斜杠和行尾被删除。
name =
之后的前导空格、第一个注释字符
#
;
之后的行的其余部分以及行尾部空格将被丢弃,除非它们用双引号引起来。值内的内部空格将逐字保留。

双引号内、双引号

"
和反斜杠
\
字符必须转义:使用
\"
表示
"
,使用
\\
表示
\

可识别以下转义序列(

\"
\\
旁边):
\n
表示换行符 (NL),
\t
表示水平制表(HT、TAB),
\b
表示退格 (BS)。其他字符转义序列(包括八进制转义序列)无效。

其中没有任何关于单引号的内容。

所以:

mvv = '!f() { cd ${GIT_PREFIX:-.};git mv -v "$1" "$2";git commit -uno "$1" "$2" -m "Renamed $1 to $2"; }; f'

这是错误的。

mvv = "!f() { cd \"${GIT_PREFIX:-.}\"; git mv -v \"$1\" \"$2\"; git commit -uno \"$1\" \"$2\" -m \"Renamed $1 to $2\"; }"

就是你想要的。您不希望在值中使用单引号,这会阻止 shell 看到您嵌入的 shell 替换语法,但您当然可以在您想要这种效果的地方使用它们。

© www.soinside.com 2019 - 2024. All rights reserved.