Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
什么是GIT_WORK_树,为什么我从未需要设置这个环境变量,为什么是现在?_Git - Fatal编程技术网

什么是GIT_WORK_树,为什么我从未需要设置这个环境变量,为什么是现在?

什么是GIT_WORK_树,为什么我从未需要设置这个环境变量,为什么是现在?,git,Git,我在Ubuntu Linux下使用Git来同步和部署我的项目 我在本地Linux工作机器上有一个Repo,在服务器上有两个Repo,一个是裸Repo,另一个是作为部署的应用程序 它一直运行良好,但现在我为我的另一个网站创建了另一个回购协议,我发现以下错误: root@vserver5:/var/www/ninethsky# git pull origin master fatal: /usr/lib/git-core/git-pull cannot be used without a worki

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

我在本地Linux工作机器上有一个Repo,在服务器上有两个Repo,一个是裸Repo,另一个是作为部署的应用程序

它一直运行良好,但现在我为我的另一个网站创建了另一个回购协议,我发现以下错误:

root@vserver5:/var/www/ninethsky# git pull origin master
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.
所以我必须设置一个
GIT\u WORKING\u树
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'
root@vserver5:/var/www/ninethsky#git init
致命:未指定GIT_DIR(或--GIT DIR=)不允许使用GIT_工作树(或--WORK TREE=)
root@vserver5:/var/www/ninethsky#git init--git dir=/var/www/ninethsky
错误:未知选项'git dir=/var/www/ninethsky'
我通过取消设置git_WORK_树(设置为空),解决了
git init
问题。
GIT\u工作树
GIT\u目录
未设置
git init
再次起作用,但在克隆的repo中,git add.等操作在设置为bare时仍然存在问题

谢谢,
Joern.

如果您有一个非裸git存储库,它有两个部分:

  • 工作树。
    工作树已签出源代码,以及您可能进行的任何更改

  • git目录。
    git目录通常称为
    .git
    ,位于工作树的顶层-它包含项目的所有历史记录、配置设置、分支指针、索引(临时区域)等。
    您的git目录包含的文件和目录有点像这样:

    branchs description HEAD index log ORIG_HEAD refs config FETCH_HEAD hooks info objects packed refs


虽然我上面描述的是git存储库的默认布局,但实际上可以将文件系统中的任何目录设置为git目录和工作树

您可以更改这些目录的默认值

  • 使用
    --work tree
    --git dir
    选项切换到
    git
  • 或者使用
    GIT_DIR
    GIT_WORK_树
    环境变量。但是,通常不需要设置这些参数

您看到的错误来自于
git pull
执行的第一个检查之一-它必须从工作树运行。我假设这是因为您设置了
GIT\u DIR
GIT\u WORK\u树
环境变量。
否则,我最好的猜测是,您的
.git
目录无法访问或以某种方式损坏


  • 如果您列出了
    /var/www/ninethsky/.git
    的内容,它看起来像我上面引用的清单吗
  • 您运行命令的用户是否可以读取和写入所有这些文件和目录,或者他们的权限是否已更改

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

  • git init
    可能会失败,因为您仍然设置了
    git_WORK_TREE
    环境变量,并且,正如错误消息所述,如果您要指定工作树,还必须指定git目录
  • 第二个变量(
    git init--git dir=/var/www/ninethsky
    )失败,因为
    --git dir
    应该在
    init
    之前
但是,在这种情况下,您根本不需要指定工作树1,因此我会确保您取消设置
GIT\u工作树
GIT\u DIR
环境变量

1也就是说,将
.git
目录放在
/var/www
下可能会被认为是一个坏主意,以防您意外设置权限,使其可以通过web访问。 因此,这可能是一个您希望将git目录保留在其他位置的实例。
但是,由于这些选项显然已经给您带来了混乱,因此最好保持git部分的简单,并用其他方法拒绝访问
.git
目录。

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


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

是否
/var/www/ninethsky
是一个工作目录,即
/var/www/ninethsky/.git
是否存在?或者
/var/www/ninethsky
本身就是git目录吗?
/var/www/ninethsky/.git
存在
/var/www/ninethsky
中的其他git操作是否正常?e、 g.
git status
是否也会产生错误?当您遇到该错误时,是否设置了其他git环境变量?(
env | egrep GIT
)@Joern Akkermann:我更新了我的答案以回应你的补充点。最关键的信息仍然是你在环境中设置了什么-env | grep GIT显示了什么?你如何取消设置
GIT工作树
?@Sisir:嗯,暂时(在bash、dash等中)使用
unset GIT\u WORK\u TREE
,但如果这是一个问题,那么它可能是在启动文件(例如
~/.bashrc
)或包装器脚本中设置的,因此您需要从那里删除设置