正确转义 git 别名中的子命令

正确转义 git 别名中的子命令

我想为以下 git 命令添加别名:

git commit --amend -m $(git log --format=%B -n1)

但是,如果我将以下内容添加到我的.gitconfigIT 错误中,则会出现“错误:未知选项‘格式 = %B’”

[alias]
  amend = commit --amend -m $(git log --format=%B -n1)

有没有办法将此命令用作别名?如果我将子命令放在单引号中,它会将其视为字符串:

[alias]
  amend = commit --amend -m '$(git log --format=%B -n1)'

运行此使用git amend会导致最后一次提交被重命名为文字:$(git log --format=%B -n1)

答案1

我对此几乎一无所知,git但我知道$( )需要一个可以解释它的 shell。通常 git 别名是 的内部别名git,它们不运行任何 shell。要定义运行任意命令的 git 别名,您需要!

我的测试表明我不需要在 shell 中运行某些东西。看来后面的命令!sh -c …无论如何都会运行。注意git!shsh $( ) 应该用双引号引起来

用这个:

[alias]
        amend = !git commit --amend -m \"$(git log --format=%B -n1)\"

双引号已转义,因此(外部)git不会用完它们。您需要它们来执行sh

答案2

@Kamil Maciorowski 的回答是正确的,但我刚刚意识到我想要的功能可以通过运行来实现:

git commit --amend --no-edit

可以使用以下方法轻松设置别名:

[alias]
  amend = commit --amend --no-edit

相关内容