为什么.git目录中不允许使用某些git命令?

时间:2012-04-02 09:25:30

标签: git

当您在.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然后它可以

对所有这些都有合理的解释吗?为什么失败命令的别名突然起作用只是因为它是别名??

2 个答案:

答案 0 :(得分:3)

有一个合乎逻辑的解释。失败的带参数的命令是这样做的,因为它们需要工作树,当你在.git存储库中时,没有工作树,只有存储库文件。其他命令带参数成功,因为它们不需要工作树。

答案 1 :(得分:1)

有一些Git提交(git wrapper: allow setup_git_directory_gently() be called earlierCall setup_git_directory() much earliergit --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存储库之外,这个改变打破了他们,   所以这复活了对这种用法的支持。