为什么在.git目录中不允许使用某些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
for git status
,然后它就起作用了!
有没有任何合理的解释? 为什么一个失败的命令的别名突然工作,只是因为它是一个别名?
有一个合理的解释。 参数失败的命令是这样做的,因为它们需要一个工作树,而当您在.git存储库中时,没有工作树,只有存储库文件。 带参数的其他命令成功,因为它们不需要工作树。
有几个Git提交(git包装:允许先前调用setup_git_directory_gently(),早些时候调用setup_git_directory()以及git --paginate:再次调用外部命令)来触及正在发生的事情。 内建命令和别名的不同行为似乎源于之前需要内置命令才能获得Git配置信息的前期问题,这需要确定Git目录和工作树以获取特定于回购的配置。
如果你有本地的Git源代码,你可以执行git log --grep='setup_git_directory_gently'
来获得与你注意到的行为相关的提交列表。
为了别名按照他们的方式行事,接受git仓库之外的git别名解释:
af05d67(始终在setup_git_directory_gently(),2008-03-25)中设置* nongit_ok)与最初提交的修补程序相比发生了变化,导致禁用git存储库之外的别名。
事实证明,有些人在$ HOME / .gitconfig中使用“alias.fubar = diff --color-words”来在git存储库之外使用非索引差异(或任何不需要git存储库的命令),并且此更改已中断他们,所以这再次支持这种用法。
链接地址: http://www.djcxy.com/p/58653.html上一篇: Why some git commands are not allowed in the .git directory?