Comment exécuter une commande Git sans être dans le référentiel?


131

Existe-t-il un moyen d'exécuter des commandes Git sur un référentiel sans être dans ce référentiel?

Par exemple quelque chose comme ceci: git /home/repo log :?

S'il vous plaît, ne me le dites pas cd. Je fais cela via un execappel.


3
Ne pouvez-vous pas simplement "cd / home / repo && git log" comme appel de l'exécutif?
Alex Howansky

J'ai des problèmes étranges avec ça. Je commence un nouveau processus, pas vraiment un cadre, mais je ne sais pas trop en quoi ils diffèrent. Je trouve plus facile de trouver simplement un paramètre pour spécifier le répertoire git.
Tour du



1
git --git-dir = / home / repo / .git log
Atiq Ur Rehman

Réponses:


102

Essayer:

git --git-dir=/home/repo/.git log

Il est important de donner le chemin jusqu'au répertoire .git de votre référentiel. Sinon, vous n'obtiendrez qu'un message d'erreur qui dit quelque chose comme:

fatal: Not a git repository

2
Je continue à avoir fatal: Not a git repository (or any of the parent directories): .git. @Patrick je n'ai rien voté?
Tour du

3
@Patrick La réponse a été modifiée (elle disait à l'origine que --work-dirje pense)
Gareth

1
Cela n'a pas fonctionné pour moi, car il montrait tous les fichiers du commit comme supprimés. On dirait qu'il vérifie le commit mais pas le contenu du dossier. Reportez-vous à la réponse de @calandoa pour de meilleures performances.
mxcd

2
Cela n'a pas fonctionné pour moi en utilisant le dernier git, mais en utilisant l'option -C cela a fonctionné, exemple: git -C /home/repo/.git log
D.Snap

1
cela n'a pas fonctionné comme prévu. pourquoi cette réponse est-elle acceptée? Cela utilisera le répertoire actuel comme arbre de travail et utilisera le .git spécifié pour l'historique, ce qui est complètement faux. Si vous n'affichez pas seulement le journal, par exemple git status,. -Cest la bonne voie à suivre.
Wang

218

Utilisez l' -Coption ( docs ):

git -C /home/repo log

C'est presque équivalent --git-diret --work-treesans ajouter le .gitdossier habituel

Éditer:

Réponse négative ... assez étonnant, car, à proprement parler, c'est la seule réponse correcte à la question. Les options --git-diret --work-treen'existent pas pour accéder au référentiel depuis l'extérieur de l'arbre de travail, elles sont utilisées pour déplacer le.git quelque part ailleurs, et elles sont beaucoup plus compliquées à utiliser dans certains cas.

Par exemple, pour obtenir le journal de /home/repo/subdirseulement:

git -C /home/repo/subdir log .

ou

git -C /home/repo log subdir

Il n'est pas possible d'utiliser log .avec --git-dirou --work-tree. Le chemin doit être traité pour extraire le sous-chemin par rapport au sommet de l'arbre de travail, et même dans ce cas, git ne le reconnaîtra pas comme un chemin si vous n'utilisez pas l' --option, donc le seul moyen possible est:

git --git-dir /home/repo/.git log -- subdir

De plus, --work-treene fonctionne pas du tout avec la logsous-commande avec ma version (git 1.9.1). Il est simplement ignoré:

git --git-dir /home/repo/.git --work-tree /home/repo/subdir log -- subdir
git --git-dir /home/repo/.git --work-tree /home/repo/whatever log -- subdir

Je ne comprends même pas s'il s'agit d'un bogue ou d'une fonctionnalité ... comme d'habitude avec de nombreux choix de conception git.


Merci d'avoir ajouté des explications supplémentaires.
Erick G.Hagstrom

git stashest un autre exemple de sous-commande qui échoue si --git-diret --work-treesont utilisés.
d5ve

4
L'option -C a été ajoutée dans la version 1.8.5 de git, qui a été publiée en 2013.
d5ve

-C fonctionnait mieux que --git-dir pour moi ... -C honore les paramètres git config pour le dépôt. J'utilise git version 1.9.5.msysgit.1
Straff

@calandoa avons-nous toujours besoin de spécifier l'emplacement à partir de la racine, encore une chose si le nom du dépôt contient plusieurs mots comment mettre dans ce code
Kasun Siyambalapitiya

17

En fait, vous devez utiliser --git-dir et --work-tree ensemble. Voici un exemple:

local [] Desktop: mkdir git
local [] Desktop: cd git
local [] git: touch README.txt
local [] git: git init
Initialized empty Git repository in /Users/albert/Desktop/git/.git/
local [] git: cd ..
local [] Desktop: git --work-tree=git --git-dir=git/.git add .
local [] Desktop: git --work-tree=git --git-dir=git/.git commit -a -m 'initial commit, called from outside the git directory'
[master (root-commit) ee951b1] initial commit, called from outside the git directory
0 files changed, 0 insertions(+), 0 deletions(-)
create mode 100644 README.txt
local [] Desktop: cd git
local [] git: git log --pretty=oneline
ee951b161053e0e0948f9e2a36bfbb60f9c87abe initial commit, called from outside the git di

1
C'est plus correct que la réponse avec --git-dir seul. git-scm.com/blog/2010/04/11/environment.html
Erick G. Hagstrom

11

J'ai essayé plusieurs fois! J'ai enfin compris!

git -C dir --no-pager log --format='%an' -1 filename

souvenez-vous, veuillez ne pas ajouter .git à votre

-C dir


3

Ceci est similaire à la réponse de @ max. Malheureusement, --git-dir n'a pas fait ce dont j'avais besoin. edit Rétrospectivement, une autre réponse [précédente] que je n'avais pas lue suggérait d'utiliser --work-tree. Je ne sais pas si l'utilisation de l'environnement ou des indicateurs est plus appropriée, je laisserai donc ma réponse au cas où quelqu'un y trouverait une utilisation, mais je passerai à utiliser --work-tree/ --git-dir.


Il y a deux repos, l'un dans l'autre mais pas un sous-module; le dépôt externe l'ignore:

tools (outer repo)
  gcc/4.9.2 (inner repo)

Ce que je voulais, c'était la sortie git rev-parse --show-prefixrelative au repo externe. Voici ce que j'ai trouvé (syntaxe bash; divisé en lignes pour plus de lisibilité):

prefix_dir=$(cd ..; git rev-parse --show-toplevel)
prefix_dir=$(GIT_WORK_TREE=${prefix_dir} git rev-parse --show-prefix)

Lorsqu'il est exécuté depuis 4.9.2, il produit la chaîne gcc/4.9.2.


1

Pour toute commande git, vous pouvez faire:

git --git-dir=<PATH-TO-REPO>/.git --work-tree=<PATH-TO-REPO> <git-command>

Par exemple, si vous voulez faire un état git:

 git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  status

ou si vous souhaitez vérifier la branche dans laquelle se trouve le dépôt:

git --git-dir=/home/myrepo/.git --work-tree=/home/myrepo/  rev-parse --abbrev-ref HEAD
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.