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 exec
appel.
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 exec
appel.
Réponses:
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
fatal: Not a git repository (or any of the parent directories): .git
. @Patrick je n'ai rien voté?
--work-dir
je pense)
git status
,. -C
est la bonne voie à suivre.
Utilisez l' -C
option ( docs ):
git -C /home/repo log
C'est presque équivalent --git-dir
et --work-tree
sans ajouter le .git
dossier habituel
Éditer:
Réponse négative ... assez étonnant, car, à proprement parler, c'est la seule réponse correcte à la question. Les options --git-dir
et --work-tree
n'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/subdir
seulement:
git -C /home/repo/subdir log .
ou
git -C /home/repo log subdir
Il n'est pas possible d'utiliser log .
avec --git-dir
ou --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-tree
ne fonctionne pas du tout avec la log
sous-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.
git stash
est un autre exemple de sous-commande qui échoue si --git-dir
et --work-tree
sont utilisés.
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
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
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-prefix
relative 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
.
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