2009-09-06 6 views
176

Je suis en train d'exécuter git à partir d'un autre répertoire que je ne suis donc par exemple si je suis.git --git-dir ne fonctionne pas comme prévu

cd /home/domain/ 
git status << runs perfect ie 
# On branch master 
# Your branch is ahead of 'origin/master' by 6 commits. 

Alors maintenant, je veux courir ce commande à partir d'un répertoire différent en utilisant l'option --git-dir.

permet donc de dire que je suis en root/ et essayez ceci:

git --git-dir="/home/domain/" status 
## Error 
fatal: Not a git repository: '/home/domain/' 

J'ai aussi essayé d'inclure le dossier .git-à-dire

git --git-dir="/home/domain/.git/" status 

Mais cela ressemble qu'il essaie de lancer git à partir de la racine, c'est-à-dire supprimer tout de mon dossier de domaine et ajouter tout dans root. J'espère que quelqu'un peut vous conseiller sur ce que je fais mal.

+4

Maintenant, j'obtenu le statut de travail parfait, mais traction est de donner les erreurs. Root @ erx [/] # git --git-dir =/home/domaine/.git --work-tree =/home/domaine/pull origine maître fatal:/usr/local/libexec/git-core/git-pull ne peut pas être utilisé sans un arbre de travail. Mais le statut fonctionne? des idées Jon – Lee

+4

C'est le plus gros bug de git en ce moment. Ne respectant pas les paramètres --work-tree et/ou --git-dir. –

+3

À partir de git 1.8.5, vous aurez le choix de * ne pas * définir '--git-dir' et' --work-tree' pour une commande simple: voir [ma réponse ci-dessous] (http: // stackoverflow. com/a/20115678/6309) – VonC

Répondre

258

Vous devez également définir le répertoire de travail. Confus je sais mais c'est une chose de flexibilité.

git --git-dir=/mycode/.git --work-tree=/mycode status 

Vous pouvez lire un peu plus here

+2

Merci cela a fonctionné! Convenu que cela est déroutant. Son appelé Keep It Simple Stupid. Vous pouvez presque toujours permettre la flexibilité tout en donnant les valeurs par défaut qui ont le plus de sens. VS ayant une commande ne fonctionne pas du tout. – Nay

+3

@Nick est d'accord, vous penseriez que si '--git-dir' n'était pas spécifié, il vérifierait si'/mycode/.git' existait et l'utiliserait avant de lancer une erreur. – GP89

+3

@NickYeates détaché! J'ai aussi eu un problème en utilisant ~ pour faire référence à mon répertoire personnel, par exemple 'git --git-dir = ~/src/s3cmd/.git --work-tree = ~/src/s3cmd pull' ne fonctionnait pas mais 'git --git-dir =/home/nom d'utilisateur/src/s3cmd/.git --work-tree =/home/nom d'utilisateur/src/s3cmd pull' did –

38

Sur la base de votre commentaire ci-dessus, il semble que vous êtes toujours en cours d'exécution dans un problème:

 
[email protected] [/]# git --git-dir=/home/domain/.git --work-tree=/home/domain/ pull origin master 
fatal: /usr/local/libexec/git-core/git-pull cannot be used without a working tree 

On dirait que vous pourriez être l'intention de exécutez cela à partir de crontab ou quelque chose. Il vaut peut-être mieux utiliser cd pour basculer d'abord vers votre répertoire de travail. Par exemple:

 
[email protected] [/]# (cd /home/domain && git pull origin master) 

Ce sera temporairement (dans un sous-shell, qui est ce que les parenthèses font) changer le répertoire courant à /home/domain, puis exécutez git pull origin master. Une fois la commande terminée, votre répertoire actuel reste celui qu'il était avant la commande.

+0

L'utilisation d'une sous-couche est simple et élégante. Je ne sais pas pourquoi je n'y avais pas pensé avant! –

+0

Désolé @Greg, a voté l'autre réponse par Jon car il a répondu à la question posée - mais je pense que vous êtes sur place avec repérer et répondre à l'intention et votre point de vue, c'est exactement ce que je cherchais +10 –

96

À partir git 1.8.5 (qui devrait être la semaine prochaine), il sera encore plus simple:

git -C "/home/domain/" status 

Pas besoin de mettre --git-dir et --work-tree plus!


Voir commit 44e1e4 par Nazri Ramliy:

Il faut plus frappes de touches pour appeler la commande git dans un autre répertoire sans quitter le répertoire courant:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-dir=~/foo status
    GIT_DIR=~/foo/.git GIT_WORK_TREE=~/foo git status
  2. (cd ../..; git grep foo)
  3. for d in d1 d2 d3; do (cd $d && git svn rebase); done

Les méthodes indiquées ci-dessus sont acceptables pour les scripts, mais sont trop lourdes pour les invocations de ligne de commande rapide.

Avec cette nouvelle option, ce qui précède peut être fait avec moins de frappes:

  1. git -C ~/foo status
  2. git -C ../.. grep foo
  3. for d in d1 d2 d3; do git -C $d svn rebase; done
Questions connexes