首页 > 解决方案 > 如何将除前两个之外的所有 bash 参数设置为 git 别名

问题描述

我想创建一个 git 别名,它将使用我定义的模板创建提交消息。

这是模板:

"[$firstVariable] $secondVariable: $thirdVariable"

  1. 第一个是分行号
  2. 第二个是提交的类型
  3. 最后一个参数是提交消息的主题

示例:

“[1000] 壮举:添加新的销售控制器”

.gitconfig这是我在文件中的 bash 函数:

[alias]
    c = "!f() { branchNumber=${1}; type=${2}; shift; shift; subject=${*}; git commit -m '['"$branchNumber"'] '"$type"': '"$subject"' '; }; f"

我可以获得前两个变量,但在第三个变量中,终端出现错误。

如果我执行这个命令,我会得到这个:

命令:$ git c 1000 feat add new sales controller

返回:

错误:pathspec 'sales' 与 git 已知的任何文件都不匹配。

错误:pathspec 'controller' 与 git 已知的任何文件都不匹配。


观察:

新销售总监

错误:pathspec 'sales' 与 git 已知的任何文件都不匹配。

错误:pathspec 'controller' 与 git 已知的任何文件都不匹配。

标签: bashgitalias

解决方案


.gitconfigGit 在解析行时“吃掉”一层双引号。因此,当您写道:

"!f() { branchNumber=${1}; type=${2}; shift; shift; subject=${*}; git commit -m '['"$branchNumber"'] '"$type"': '"$subject"' '; }; f"

外壳看到的是:

!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被视为pathspec参数。

一种简单的解决方法是用反斜杠双引号替换您希望保留的每个双引号:

    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"

推荐阅读