Что такое GIT_WORK_TREE, почему мне никогда не приходилось устанавливать этот ENV var, почему сейчас? - программирование
Подтвердить что ты не робот

Что такое GIT_WORK_TREE, почему мне никогда не приходилось устанавливать этот ENV var, почему сейчас?

Я использую Git под Ubuntu Linux для синхронизации и развертывания моих проектов.

У меня есть Repo на моей локальной рабочей станции Linux и два репозитория на моем сервере, один голый репо и один в качестве развернутого приложения.

Он всегда работал нормально, но теперь я создал другое репо для моего другого сайта, и теперь я получаю эту ошибку:

[email protected]:/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 и репо на моей локальной рабочей машине.

Затем я удалил все репозитории, но исходный, теперь я получаю:

[email protected]:/var/www/ninethsky# git init
fatal: GIT_WORK_TREE (or --work-tree=<directory>) not allowed without specifying GIT_DIR (or --git-dir=<directory>)
[email protected]:/var/www/ninethsky# git init --git-dir=/var/www/ninethsky
error: unknown option `git-dir=/var/www/ninethsky'

Я решил проблему git init, отключив GIT_WORK_TREE, который был установлен как пустой. GIT_WORK_TREE и GIT_DIR не установлены. git init работает снова, все еще существует проблема с git add . и т.д. когда дело доходит до действий Git в клонированном репо, который был установлен на голый.

Спасибо, Йорн.

4b9b3361

Ответ 1

Если у вас есть не-голый репозиторий 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 поэтому я бы удостоверился, что вы отключите переменные среды GIT_WORK_TREE и GIT_DIR.

1 Это можно считать плохой идеей сохранить ваш каталог .git под /var/www в случае, если вы случайно установили разрешения, чтобы он был доступен через Интернет, поэтому это может быть экземпляр, в котором вы хотите сохранить каталог git в другом месте, однако, поскольку эти параметры явно уже создают путаницу для вас, возможно, лучше сохранить часть git простой и запретить доступ к каталогу .git другими способами.