Utilisez la commande git «log» dans un autre dossier

128

J'ai quelques fichiers php dans un dossier A (qui est un projet git). Dans ces fichiers php, je veux exécuter "git log" mais pour le dossier B. Le dossier B est un autre projet git (donc le journal est différent entre A et B).

Comment puis-je faire cela avec la commande shell?

Aurélien B
la source
3
cd /other/dir && git log && cd -en bash shell?
prend le
1
Avec git 1.8.5 (Q4 2013), vous aurez un autre choix, au lieu de paramétrer --git-dir: voir ma réponse ci
VonC
Possible duplication de git pull alors qu'il n'est pas dans un répertoire git
Code-Apprentice

Réponses:

189

De man git,:

Vous pouvez le faire avec le --git-dirparamètre, avant de passer des commandes.

git --git-dir /foo/bar/.git log

(Il .gitest nécessaire de spécifier le répertoire.) À partir de la documentation :

--git-dir=<path>

Définissez le chemin d'accès au référentiel. Cela peut également être contrôlé en définissant la GIT_DIRvariable d'environnement. Il peut s'agir d'un chemin absolu ou relatif vers le répertoire de travail actuel.

rgngl
la source
26
Vous devez référencer le .gitrépertoire. Essayez git --git-dir=/foo/bar/.git log.
mipadi du
6
désolé, j'ai tort de ne pas mettre le = entre --git-dir et le nom du répertoire. donc il devient git --git-dir / foo / bar log
rgngl
23
Avertissement! Cette approche est interrompue pour les opérations autres que log. Essayez git --git-dir /foo/someclone/.git status- git est totalement confus. Je recommande -Ccomme indiqué ci-dessous.
Air du
Je n'ai pas encore trouvé de page d'aide git qui inclut la chaîne "--git-dir": '(
thinsoldier
1
@thinsoldier le man gitfait sur mon système (2.3.5). Mais la réponse @VonC fonctionne beaucoup mieux.
Calimo
146

Avec git 1.8.5 (Q4 2013) , vous aurez un autre choix, au lieu de paramétrer --git-dir.
Si vous souhaitez exécuter git logdans un dossier B, tapez:

git -C B log

Tout comme " make -C <directory>", " git -C <directory> ..." dit à Git d'y aller avant de faire quoi que ce soit d'autre .


Voir commit 44e1e4 de Nazri Ramliy :

Il faut plus d'appuis sur les touches pour appeler la commande git dans un répertoire différent sans quitter le répertoire courant:

  1. (cd ~/foo && git status)
    git --git-dir=~/foo/.git --work-tree=~/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 présentées ci-dessus sont acceptables pour les scripts, mais sont trop lourdes pour les appels rapides de ligne de commande.

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
VonC
la source
19
C'est une approche beaucoup plus fiable et fonctionne pour des commandes autres que log.
Air du
wow, et rien dans la page de manuel! C'est dommage. (ok, maintenant je le vois ajouté dans la page de manuel 2.7)
akostadinov
Malheureusement, ce n'est toujours pas aussi agréable que l' -Roption de Mercurial , car elle gâche les chemins relatifs. Par exemple, si je tape, git -C subdir log subdir/myfilecela donne une erreur (car il recherche le fichier subdir/subdir/myfile).
jwd
--git-dir est plus pratique lorsque vous faites quelque chose comme ceci:for p in (find . -type d -name ".git"); do git --git-dir $p ...; done
shabunc
1
@jwd: Je ne sais pas en quoi c'est un problème? Ce que vous avez cité, c'est le comportement précis auquel je m'attendais, et je ne voudrais gitpas penser qu'il était plus intelligent que moi et ce que j'ai tapé. Si je dis «lancez ceci dans le répertoire X», je ne veux pas dire «sauf parfois, faites autre chose».
underscore_d