71 votes

Qu'est-ce que GIT_WORK_TREE, pourquoi n'ai-je jamais eu besoin de définir cette variable ENV, pourquoi maintenant ?

J'utilise Git sous Ubuntu Linux pour synchroniser et déployer mes projets.

J'ai un dépôt sur ma machine de travail Linux locale et deux dépôts sur mon serveur, un dépôt nu et un dépôt en tant qu'application déployée.

Cela a toujours bien fonctionné, mais maintenant que j'ai créé un autre dépôt pour mon autre site Web, j'obtiens cette erreur :

root@vserver5:/var/www/ninethsky# git pull origin master
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.

Je dois donc définir un GIT_WORKING_TREE ENV-Var, mais qu'est-ce que c'est exactement, où le mettre ?

Voici le fichier .git/config de mon dépôt :

[core]
        repositoryformatversion = 0
        filemode = true
        bare = false
        logallrefupdates = true
[remote "origin"]
        url = /home/git/ninethsky/.git
        fetch = +refs/heads/*:refs/remotes/origin/*

Il existe un autre dépôt avec bare = true et un repo sur ma machine de travail locale.

Puis j'ai supprimé tous les dépôts sauf le dépôt initial, et maintenant j'obtiens :

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'

J'ai résolu le git init en désactivant GIT_WORK_TREE, qui était défini comme vide. GIT_WORK_TREE y GIT_DIR ne sont pas réglés. git init fonctionne à nouveau, mais il y a toujours un problème avec git add . et ainsi de suite en ce qui concerne les actions git dans le repo cloné, qui a été mis à nu.

Merci, Joern.

0 votes

Est /var/www/ninethsky un répertoire de travail, c'est-à-dire que /var/www/ninethsky/.git existe-t-il ? Ou est-ce que /var/www/ninethsky lui-même un répertoire git ?

0 votes

/var/www/ninethsky/.git existe

0 votes

Effectuer d'autres opérations git dans /var/www/ninethsky le travail ? par exemple, est-ce que git status produit également une erreur ? Avez-vous d'autres variables d'environnement git définies lorsque vous obtenez cette erreur ? ( env|egrep GIT )

126voto

Mark Longair Points 93104

Si vous avez un dépôt git non dénudé, il y a deux parties à cela :

  • l'arbre de travail.
    L'arbre de travail contient votre code source extrait, avec toutes les modifications que vous avez pu apporter.

  • le répertoire git.
    Le répertoire git est normalement appelé .git Il contient tout l'historique de votre projet, les paramètres de configuration, les pointeurs vers les branches, l'index (zone de transit) et ainsi de suite.
    Votre répertoire git est celui qui contient les fichiers et les répertoires qui ressemblent un peu à ceci :

    branches description HEAD index logs ORIG_HEAD refs config FETCH_HEAD hooks info objects packed-refs


Bien que ce que j'ai décrit ci-dessus soit la disposition par défaut d'un dépôt git, vous pouvez en fait configurer tout dans le système de fichiers pour être votre répertoire git et votre arbre de travail.

Vous pouvez modifier ces répertoires à partir de leurs valeurs par défaut

  • soit avec le --work-tree y --git-dir options pour git
  • ou en utilisant le GIT_DIR y GIT_WORK_TREE variables d'environnement. En général, cependant, vous ne devriez pas avoir besoin de les définir.

L'erreur que vous voyez provient d'un des premiers contrôles que git pull il doit être exécuté à partir d'un arbre de travail. Je suppose que cela est dû au fait que vous avez défini l'option GIT_DIR o GIT_WORK_TREE les variables d'environnement.
Sinon, je pense que votre .git n'est pas accessible ou est corrompu d'une manière ou d'une autre.

  • Si vous répertoriez le contenu de /var/www/ninethsky/.git ressemble-t-il à la liste que j'ai citée plus haut ?
  • Tous ces fichiers et répertoires sont-ils lisibles et inscriptibles par l'utilisateur sous lequel vous exécutez la commande, ou leurs autorisations ont-elles été modifiées ?

Mise à jour : En réponse aux points des informations complémentaires que vous avez mis à jour dans votre question :

  • git init échoue vraisemblablement parce que vous avez toujours la GIT_WORK_TREE et, comme le dit le message d'erreur, si vous spécifiez l'arbre de travail, vous devez également spécifier le répertoire git.
  • La deuxième variante ( git init --git-dir=/var/www/ninethsky ) échoue parce que le --git-dir devrait venir devant le init .

Cependant, dans cette situation, il n'est pas nécessaire de spécifier l'arbre de travail. 1 donc je m'assurerais que vous non activé le site GIT_WORK_TREE y GIT_DIR les variables d'environnement.

1 Cela dit, cela pourrait être considéré comme une mauvaise idée de garder votre .git sous le répertoire /var/www au cas où vous auriez accidentellement défini les permissions de sorte qu'il soit accessible sur le web. Il s'agit donc d'un cas où vous souhaitez conserver le répertoire git ailleurs. Cependant, étant donné que ces options sont déjà clairement source de confusion pour vous, il est peut-être préférable de garder la partie git simple et de refuser l'accès au répertoire .git avec d'autres moyens.

4 votes

Comment faites-vous non activé GIT_WORK_TREE ?

4 votes

@Sisir : bien, temporairement (dans bash, dash, etc.) avec unset GIT_WORK_TREE mais on peut supposer que si cela pose un problème, il a été défini dans un fichier de démarrage (par ex. ~/.bashrc ) ou d'un wrapper script, vous devrez donc supprimer le paramètre à cet endroit.

2 votes

Avec la sortie de la git worktree dans git 2.5, je crois que l'option GIT_DIR doit être utilisée avec précaution et vous devrez peut-être utiliser la variable d'environnement GIT_COMMON_DIR de worktrees. Il s'agit d'un développement récent qui s'est produit après la publication de cette réponse et qu'il serait bon de mentionner.

4voto

crd23 Points 41

Il est peut-être préférable de garder la partie git simple et de refuser l'accès au répertoire .git par d'autres moyens.

Vous pouvez utiliser .htaccess pour interdire l'accès public au répertoire .git.

0 votes

Pourquoi faire cela alors qu'il est si facile de créer des liens symboliques et de faire simplement pointer le répertoire web public et le répertoire web servi vers les fichiers de construction de votre dépôt qui se trouve quelque part sous le répertoire public ?

0 votes

Parce que c'est la dernière suggestion sur la réponse acceptée et que crd23 a posté un lien sur la façon de le faire. @crd23 aurait probablement dû mettre à jour l'autre post et mettre le lien sous le texte référencé, mais ils sont toujours des noob et nous leur pardonnons !

0voto

Code Commander Points 1352

Vous pouvez également rencontrer cette erreur si vous avez renommé le chemin (working-tree) d'un sous-module git. Dans mon cas, j'avais mis à jour le chemin dans .gitmodules pour correspondre à mon nouveau chemin et je pensais que j'étais bon. Mais quand j'ai fait un git pull plus tard, il a ajouté de nouveaux fichiers dans l'ancien chemin. C'est parce qu'il y a deux endroits où le chemin du module est défini. Vous devez également mettre à jour votre "arbre de travail" tel que défini dans le fichier .git/modules/{modulename}/config archivo.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X