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

时间:2011-03-12 15:01:31

标签: git

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

我的本​​地Linux工作机器上有Repo,我的服务器上有两个repos,一个裸仓库和一个部署应用程序。

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

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的仓库和我当地工作机器上的仓库。

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

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操作时,该问题已设置为裸露。

谢谢, Joern。

3 个答案:

答案 0 :(得分:115)

如果你有一个非裸git存储库,它有两个部分:git目录和工作树。工作树包含您已检出的源代码,您可能已做出任何更改。 git目录通常称为.git,位于工作树的顶层 - 这包含项目的所有历史记录,配置设置,分支指针,索引(暂存区域)等。您的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环境变量。但是,通常您不需要设置它们。

您看到的错误来自git pull执行的第一次检查 - 它必须从工作树运行。我假设这是因为您设置了GIT_DIRGIT_WORK_TREE环境变量。否则,我最好的猜测是您的.git目录无法以某种方式访问​​或损坏。如果您列出/var/www/ninethsky/.git的内容,是否看起来像我上面引用的商家信息?所有这些文件和目录是否都是您正在运行命令的用户可读写的,或者他们的权限是否已更改?


更新:为了回答您更新问题的其他信息中的要点:

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

但是,在这种情况下,您根本不需要指定工作树, 1 所以我要确保您取消设置 {{1} }和GIT_WORK_TREE环境变量。

1 也就是说,将GIT_DIR目录保存在.git下以防万一你不小心设置了可以访问web的权限,这被认为是个坏主意。所以这可能是你想把git目录放在别处的实例 - 但是,因为这些选项显然已经引起了你的困惑,也许最好保持git部分简单并拒绝访问/var/www目录其他方式。

答案 1 :(得分:4)

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

You can use .htaccess to deny public access to the .git directory

答案 2 :(得分:0)

如果您重命名了git子模块的路径(工作树),也可能会遇到此错误。在我的情况下,我更新了.gitmodules中的路径以匹配我的新路径,并认为我很好。但是当我在git pull之后,它在旧路径中添加了新文件。这是因为模块路径有两个定义的位置。您还需要更新.git/modules/{modulename}/config文件中定义的“工作树”。