使用大括号引用git修订/引用失败
我正在尝试从存储中签出单个文件:使用大括号引用git修订/引用失败,git,shell,zsh,Git,Shell,Zsh,我正在尝试从存储中签出单个文件: git checkout stash@{0} -- some/file 此操作失败,原因是致命:引用无效:stash@0 看起来花括号被去掉了,但我不确定是谁干的 藏匿修订就在那里git存储列表返回 stash@{0}: WIP on X stash@{1}: WIP on Y 我在zsh上使用git1.9.1 有没有办法防止这种大括号消除?通常最好引用包含{…}序列的字符串(例如,git checkout'stash@{0}'…),因为它们会受到限制。 (
git checkout stash@{0} -- some/file
此操作失败,原因是致命:引用无效:stash@0
看起来花括号被去掉了,但我不确定是谁干的
藏匿修订就在那里<代码>git存储列表返回
stash@{0}: WIP on X
stash@{1}: WIP on Y
我在zsh上使用git1.9.1
有没有办法防止这种大括号消除?通常最好引用包含
{…}
序列的字符串(例如,git checkout'stash@{0}'…
),因为它们会受到限制。(或者,在这个问题上,用单引号引用任何要保留原样的字符串文字。)
但是,在默认
zsh
环境中,这不会是一个问题,因为{0}
不是有效的大括号表达式,因此只是按原样打印(同样适用于bash
、dash
和ksh
);核实:
echo stash@{0} # prints as is in bash, dash, ksh, zsh (with default options in effect)
值得称赞的是,怀疑可能设置了brake\u CLL
zsh
选项,这确实会产生症状:
$ setopt BRACE_CCL
$ echo stash@{0}
stash@0 # !! braces removed
正如切普纳所说,brake_CCL
“导致{0}
被视为包含一个字符的字符类,而不是按字面意义处理”;换句话说:BRACE\u CCL
展开{…}
中的每个字符(例如,回显a{01}
->a0 a1
),只需指定一个字符,净效果就是移除封闭的大括号
正如OP本人所确认的那样,
unsetopt BRACE_CCL
解决了这个问题。通常最好用{..}
序列引用字符串(例如,git checkout'stash}“…
,因为它们可以被解释为大括号扩展。然而,在zsh
中,我不认为这是问题的根源,因为{0}
不是有效的大括号表达式,因此只是按原样打印;请使用打印隐藏{0}
验证。您的环境中是否有可疑内容?(输出$env){0}
也不是bash的有效大括号扩展。您的shell中似乎设置了brace\u CCL
选项,这会导致{0}
被视为一个包含一个字符的字符类,而不是字面意义上的字符。很好的发现,谢谢切普纳,unset-opt-BRACE\u-CCL
永久修复了它。必须是YADR中的一些预设。我的荣幸;感谢@chepner解决了这个谜团。我需要做些事情来弥补我之前答案的火车失事:)