使用大括号引用 git revisions/references 失败

Using curly braces referencing git revisions/references fails

我正在尝试从存储中检出单个文件:

git checkout stash@{0} -- some/file

失败 fatal: invalid reference: stash@0

看起来花括号被消除了,但我不确定罪魁祸首。

隐藏修订版在那里。 git stash listreturns

stash@{0}: WIP on X
stash@{1}: WIP on Y

我在 zsh 上使用 git 1.9.1。

有没有办法防止这个大括号被删除?

通常最好引用包含 {...} 序列的字符串(例如 git checkout 'stash@{0}' ...),因为它们受制于 brace expansion.
(或者,就此而言,单引号 any 您想要保留 原样 的字符串文字。)

然而,在默认zsh环境中,这个不会 是个问题 ,因为 {0} 不是有效的大括号表达式 ,因此只按原样打印(同样适用于 bash, dash, 和 ksh);验证:

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

感谢 chepner 怀疑 BRACE_CLL zsh 选项可能已设置 ,这确实会产生症状:

$ setopt BRACE_CCL
$ echo stash@{0}
stash@0          # !! braces removed

正如切普纳所说,BRACE_CCL "causes {0} to be treated as a character class containing one character, rather than being treated literally";换句话说:BRACE_CCL{...} 中扩展 每个单独的字符 (例如,echo a{01} -> a0 a1)并且只有 一个字符指定,净效果是移除外括号。

正如 OP 本人后来确认的那样,unsetopt BRACE_CCL 解决了问题。