我在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。
答案 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_DIR
和GIT_WORK_TREE
环境变量。但是,通常您不需要设置它们。
您看到的错误来自git pull
执行的第一次检查 - 它必须从工作树运行。我假设这是因为您设置了GIT_DIR
或GIT_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
文件中定义的“工作树”。