什么是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_DIR
和GIT_WORK_TREE
环境variables。 但是,通常情况下,您不需要设置这些。
你看到的错误是来自git pull
的第一个检查之一 – 它必须从一个工作树上运行。 我假设这是由于你设置了GIT_DIR
或GIT_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_TREE
和GIT_DIR
环境variables。
1也就是说,将.git
目录保存在/var/www
下可能会被认为是一个坏主意,以防万一您意外设置了可访问的权限,所以这可能是一个您希望保留git目录的实例其他地方 – 然而,因为这些选项显然已经引起了你的混淆,所以最好保持git部分的简单,并用其他方法拒绝访问.git
目录。
也许最好保持git部分简单,并用其他方法拒绝访问.git目录。
您可以使用.htaccess来拒绝对.git目录的公共访问