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.
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.
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-dirje pense)
git status,. -Cest la bonne voie à suivre.
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.
git stashest un autre exemple de sous-commande qui échoue si --git-diret --work-treesont 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-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.
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