什么是GIT_WORK_TREE,为什么我从来不需要设置这个ENVvariables,为什么现在呢?

我在Ubuntu Linux下使用Git来同步和部署我的项目。

我在我的本地Linux工作机器上有Repo,在我的服务器上有两个回购站,一个是回收站,另一个是已部署的应用程序。

它总是工作正常,但现在我为我的其他网站创build了另一个回购,现在我得到这个错误:

root@vserver5:/var/www/ninethsky# git pull origin master fatal: /usr/lib/git-core/git-pull cannot be used without a working tree. 

所以我必须设置一个GIT_WORKING_TREE ENV-VAR,但究竟是在哪里设置的呢?

这是我的回购的.git / config:

 [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] url = /home/git/ninethsky/.git fetch = +refs/heads/*:refs/remotes/origin/* 

还有另一个在我的本地工作机器上使用bare = true和repo的回购。

然后,我删除了所有的回购,但最初的一个,现在我得到:

 root@vserver5:/var/www/ninethsky# git init fatal: GIT_WORK_TREE (or --work-tree=<directory>) not allowed without specifying GIT_DIR (or --git-dir=<directory>) root@vserver5:/var/www/ninethsky# git init --git-dir=/var/www/ninethsky error: unknown option `git-dir=/var/www/ninethsky' 

我通过取消设置为空的GIT_WORK_TREE解决了git init问题。 GIT_WORK_TREE和GIT_DIR未设置。 git init再次工作,仍然有问题与git add . 等等,当涉及到克隆回购,被设置为裸的git行动。

谢谢,乔恩。

如果你有一个非纯粹的git仓库,它有两个部分:git目录和工作树。 工作树有你检出的源代码,你可能做了任何改变。 git目录通常称为.git ,它位于工作树的顶层,它包含项目的所有历史logging,configuration设置,分支指针,索引(暂存区域)等等。 你的git目录是包含如下所示的文件和目录的目录:

 branches description HEAD index logs ORIG_HEAD refs config FETCH_HEAD hooks info objects packed-refs 

虽然我上面描述的是git仓库的默认布局,但实际上可以将文件系统中的任何目录设置为您的git目录和工作树。 您可以使用--work-tree--git-dir选项将这些目录从默认值更改为git或使用GIT_DIRGIT_WORK_TREE环境variables。 但是,通常情况下,您不需要设置这些。

你看到的错误是来自git pull的第一个检查之一 – 它必须从一个工作树上运行。 我假设这是由于你设置了GIT_DIRGIT_WORK_TREE环境variables。 否则,我最好的猜测是你的.git目录不能以某种方式访问​​或损坏。 如果列出/var/www/ninethsky/.git的内容,它看起来像我上面引用的列表吗? 所有这些文件和目录是否可以被用户运行该命令的用户读写,或者他们的权限可能已更改?


更新:在回答更新您的问题的附加信息中的点:

  • git init可能会失败,因为你仍然设置了GIT_WORK_TREE环境variables,并且如错误信息所示,如果你指定了工作树,你还必须指定git目录。
  • 第二个变种( git init --git-dir=/var/www/ninethsky )失败了,因为--git-dir应该在init之前。

但是,在这种情况下,您根本不需要指定工作树,所以我会确保您取消设置 GIT_WORK_TREEGIT_DIR环境variables。

1也就是说,将.git目录保存在/var/www下可能会被认为是一个坏主意,以防万一您意外设置了可访问的权限,所以这可能是一个您希望保留git目录的实例其他地方 – 然而,因为这些选项显然已经引起了你的混淆,所以最好保持git部分的简单,并用其他方法拒绝访问.git目录。

也许最好保持git部分简单,并用其他方法拒绝访问.git目录。

您可以使用.htaccess来拒绝对.git目录的公共访问