2012-04-02 85 views
7

当您在.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对于git status那么它的工作原理是

对此有任何合理的解释吗?为什么一个失败的命令的别名突然工作,只是因为它是一个别名?

回答

3

有一个合理的解释。命令的参数失败了,因为它们需要一个工作树,并且当你在.git存储库中时,没有工作树,只有存储库文件。其他命令的参数成功,因为它们不需要工作树。

+0

好点。这似乎是逻辑。这并不能解释别名的行为,虽然... – 2012-04-02 16:21:33

+0

什么是别名? – GoZoner 2012-04-02 16:26:53

+0

正如丹·克鲁兹在下面所说的,一些别名可能在仓库之外工作,但不应该依赖,坦率地说,这听起来很危险。 – GoZoner 2012-04-03 03:30:45

1

有几个Git提交(git wrapper: allow setup_git_directory_gently() be called earlier,Call setup_git_directory() much earliergit --paginate: paginate external commands again)触及正在发生的事情。内建命令和别名的不同行为似乎源于之前需要内置命令才能获得Git配置信息的前期问题,这需要确定Git目录和工作树以获取特定于回购的配置。

如果您在本地拥有Git源代码,则可以执行git log --grep='setup_git_directory_gently'以获取与您注意到的行为相关的提交列表。

为什么别名的行为他们的方式,Accept git aliases outside a git repository解释说:

af05d67(始终设置* nongit_ok在setup_git_directory_gently(), 2008-03-25)已经从最初提交的补丁导致的变化 禁用git仓库以外的别名。

事实证明,使用了一些人“alias.fubar = DIFF - 颜色词”在 $ HOME /的.gitconfig使用非指标DIFF(或不需要 Git仓库中的任何命令)之外的git这个变化打破了他们, ,所以这再次支持这种用法。

相关问题