使用引用git revisions/references的花括号失败

kos*_*tja 6 git shell zsh

我想从stash中检出一个文件:

git checkout stash@{0} -- some/file
Run Code Online (Sandbox Code Playgroud)

这失败了 fatal: invalid reference: stash@0

看起来花括号被淘汰了,但我不确定罪魁祸首.

存储修订就在那里.git stash list回报

stash@{0}: WIP on X
stash@{1}: WIP on Y
Run Code Online (Sandbox Code Playgroud)

我在zsh上使用git 1.9.1.

有没有办法防止这种大括号消除?

mkl*_*nt0 5

引用包含{...}序列(例如git checkout 'stash@{0}' ...)的字符串通常更好,因为它们受到括号扩展的影响.
(或者,对于这个问题,单引号的任何字符串字面量要保留原样.)

然而,在默认 zsh环境不会是一个问题,因为{0}不是有效的支架表达并且因此被简单地打印为是(同样适用于bash,dashksh); 验证:

echo stash@{0}  # prints as is in bash, dash, ksh, zsh (with default options in effect)
Run Code Online (Sandbox Code Playgroud)

荣誉对chepner怀疑该BRACE_CLL zsh选项可以设置,这的确不产生症状:

$ setopt BRACE_CCL
$ echo stash@{0}
stash@0          # !! braces removed
Run Code Online (Sandbox Code Playgroud)

正如chepner所说,BRACE_CCL"原因{0}被视为包含一个字符的字符类,而不是字面上的对待"; 换句话说:BRACE_CCL扩展内部的每个单独的字符{...}(例如,echo a{01}- > a0 a1)并且只指定一个字符,净效果是删除封闭的大括号.

由于OP自己已经确认,unsetopt BRACE_CCL解决了这个问题.

  • 我需要做点什么来弥补我以前的答案的火车残骸:) (2认同)