我有时会使用诸如 !和 $ 在提交消息中,它们需要手动转义,但如果您使用像这样的单引号则不需要git commit -m 'My $message here!'
。我尝试编写一个函数来 makegc
和后面的所有文本作为消息,但没有成功使其使用单引号。我尝试过的所有方法,最后似乎仍然使用双引号,使该$message
部分隐藏,并且!
也不起作用。
我试过这个:
gc() {
git commit -m ''$*''
}
还有这个:
gc() {
message="$*"
git commit -m ''$message''
}
当检查消息中未显示git log
以开头的单词时,也尝试了其他不起作用的方法。$
它适用于单引号,但无论如何它都使用双引号。
我想在应该是消息gc My $message here
之后运行所有文本gc
,我不能强迫它使用单引号,它最终会变成双引号。它只会输出My here
。
有没有办法编写这个函数,让它按照我想要的方式工作?不确定这是否可行,谢谢!
如果有的话你比Bard、ChatGPT、Claude和Bing AI更聪明,因为我也问了他们,几个小时都没有运气。
答案1
TL,DR:不要。
你所要求的是不可能的。当您编写 时gc My $message here
,这是一条扩展变量值message
并将扩展用作函数参数的一部分的指令。
您可以通过使用添加注释标记的别名欺骗 shell 并调用从 shell 历史记录中读取注释的函数来完成您想要的操作。这允许该函数接收除换行符之外的任意字符。
setopt interactive_comments
alias gc='gc_function #'
function gc_function {
emulate -LR zsh
setopt extended_glob
local msg=${history[$HISTCMD]#*[[:space:]]##}
git commit -m "$msg"
}
这不是(也不可能)完全稳健。我发布的版本需要在 ; 之后有一个空格或其他空白字符gc
。如果您使用不同的非单词组成字符,则提交消息可能不是您所期望的。
我不推荐这个。您使编写一行提交消息变得容易,但编写良好的提交消息却变得困难。良好的提交消息解释了提交的作用和方式。好的提交消息是在编辑器中编写的。如果你编写一行提交消息,那么你就做错了,你会后悔的。