我正在尝试编写一个带有单引号的 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
错误。
我希望它能发挥作用。
简短的回答似乎是“不,使用双引号”。为了避免手动转义内部引号,可以要求 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 命令解释器不喜欢命令行中的撇号(单引号)。如果我说得不对,请有更了解的人纠正我。
git help config
语法部分中用于在字符串值配置中引用的规则:
定义值的行可以通过以
结束来继续到下一行;反斜杠和行尾被删除。\
之后的前导空格、第一个注释字符name =
或#
之后的行的其余部分以及行尾部空格将被丢弃,除非它们用双引号引起来。值内的内部空格将逐字保留。;
双引号内、双引号
和反斜杠"
字符必须转义:使用\
表示\"
,使用"
表示\\
。\
可识别以下转义序列(
和\"
旁边):\\
表示换行符 (NL),\n
表示水平制表(HT、TAB),\t
表示退格 (BS)。其他字符转义序列(包括八进制转义序列)无效。\b
其中没有任何关于单引号的内容。
所以:
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 替换语法,但您当然可以在您想要这种效果的地方使用它们。