在 zsh 中运行带单引号的 `git commit -m`

在 zsh 中运行带单引号的 `git commit -m`

我有时会使用诸如 !和 $ 在提交消息中,它们需要手动转义,但如果您使用像这样的单引号则不需要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。如果您使用不同的非单词组成字符,则提交消息可能不是您所期望的。

我不推荐这个。您使编写一行提交消息变得容易,但编写良好的提交消息却变得困难。良好的提交消息解释了提交的作用和方式。好的提交消息是在编辑器中编写的。如果你编写一行提交消息,那么你就做错了,你会后悔的。

相关内容