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

Joe*_*ann 64 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.
Run Code Online (Sandbox Code Playgroud)

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

这是我的repo的.git/config:

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = /home/git/ninethsky/.git
        fetch = +refs/heads/*:refs/remotes/origin/*
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

git init通过取消设置为空白的GIT_WORK_TREE 解决了这个问题.GIT_WORK_TREE和GIT_DIR未设置.git init再次工作,仍然有一个问题,git add .等等克隆回购中的git动作,它被设置为裸露.

谢谢,乔恩.

Mar*_*air 117

如果你有一个非裸git存储库,它有两个部分:git目录和工作树.工作树包含您已检出的源代码,您可能已做出任何更改.通常调用git目录.git,它位于工作树的顶层 - 这包含项目的所有历史记录,配置设置,分支指针,索引(暂存区域)等.您的git目录包含的文件和目录看起来像这样:

branches  description  HEAD   index  logs     ORIG_HEAD    refs
config    FETCH_HEAD   hooks  info   objects  packed-refs
Run Code Online (Sandbox Code Playgroud)

虽然我上面描述的是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所以我想确保你取消设置GIT_WORK_TREEGIT_DIR环境变量.

1也就是说,如果您不小心设置了可以访问Web的权限,那么保留您的.git目录可能被认为是个坏主意/var/www,因此这可能是您希望将git目录保存在其他位置的实例 - 但是,因为这些选项显然已经引起了你的困惑,也许最好保持git部分简单并拒绝.git使用其他方法访问目录.

  • 你怎么*取消*`GIT_WORK_TREE`? (3认同)
  • @Sisir:好吧,暂时(在bash,破折号等)使用`unset GIT_WORK_TREE`,但大概如果这是一个问题,那么它已被设置在启动文件(例如`〜/ .bashrc`)或包装脚本中,所以你需要从那里删除设置. (3认同)
  • 随着git 2.5中[[git worktree`](https://git-scm.com/docs/git-worktree)的发布,我认为应谨慎使用`GIT_DIR`环境变量,您可能需要使用工作树中的`GIT_COMMON_DIR`。这是发布此答案后发生的最新情况,值得一提。 (2认同)