当您在.git
目录中时,允许哪些命令,以及哪些命令不允许,似乎存在一些不一致。例如
git symbolic-ref HEAD
或
git diff --staged
很好。
但是
git diff
或
git status
生成错误消息:
fatal: This operation must be run in a work tree
更令人惊讶:创建上述其中一个失败命令的别名,例如git st
git status
,然后它可以!
对所有这些都有合理的解释吗?为什么失败命令的别名突然起作用只是因为它是别名??
答案 0 :(得分:3)
有一个合乎逻辑的解释。失败的带参数的命令是这样做的,因为它们需要工作树,当你在.git存储库中时,没有工作树,只有存储库文件。其他命令带参数成功,因为它们不需要工作树。
答案 1 :(得分:1)
有一些Git提交(git wrapper: allow setup_git_directory_gently() be called earlier,Call setup_git_directory() much earlier和git --paginate: paginate external commands again)可以触及正在发生的事情。内置命令和别名的不同行为似乎源于之前的问题,其中内置命令需要更早地获取Git配置信息,这需要确定Git目录和工作树以获得特定于repo的配置。
如果您在本地拥有Git源,则可以执行git log --grep='setup_git_directory_gently'
以获取与您注意到的行为相关的提交列表。
为什么别名的行为与他们一样,Accept git aliases outside a git repository 解释说:
af05d67(始终在setup_git_directory_gently()中设置* nongit_ok, 2008-03-25)最初提交的补丁发生了变化 禁用git存储库外的别名。
事实证明,有些人使用" alias.fubar = diff --color-words"在 $ HOME / .gitconfig使用非索引diff(或任何不需要的命令) git存储库,在git存储库之外,这个改变打破了他们, 所以这复活了对这种用法的支持。