Est-il possible d'obtenir le git répertoire racine en une seule commande?
Mercurial a un moyen de l'impression, le répertoire racine (qui contient .hg) via
hg root
Est-il quelque chose d'équivalent dans git pour obtenir le répertoire qui contient le .répertoire git?
- Bon script Emil. Je fais le script disponible en ligne, et a permis la possibilité d'ajouter un fichier/répertoire en argument. github.com/Dieterbe/git-scripts/commit/...
- Aussi pour tous ceux curieux ou à la recherche
bzr root
a été beaucoup utilisé en Bazar - Veuillez prendre note de 'dmv' : Git-Conscient " cd " par rapport à la Racine du Référentiel avec l'Auto-Complétion dans le jeetworks.org/node/52.
- Envisagez de ma réponse ci-dessous
git rev-parse --git-dir
, comme il est expliqué dans ce commentaire - le lien est mort.
- archive lien web.archive.org/web/20130526035714/http://jeetworks.org/node/52
Vous devez vous connecter pour publier un commentaire.
Oui:
Note: Dans un sous-module cela permet d'afficher le répertoire racine du sous-module et non pas le parent de référentiel. Si vous utilisez Git >=2.13 ou ci-dessus, voici une manière qui submodules peut montrer la superproject du répertoire racine. Si votre git est plus vieux, voir cette autre réponse.
git config --global alias.exec '!exec '
donc je peux faire des choses commegit exec make
. Cela fonctionne parce que les aliases sont toujours exécutés dans le répertoire de niveau supérieur.hg root
n'. Il imprime le répertoire de niveau supérieur de votre extrait de référentiel. Il ne veut pas passer pour elle (et elle ne le pouvait pas, en fait, le faire parce que de la façon dont l'ensemble du concept de répertoire courant et votre shell interagir).~/my.proj/foo/bar
, et~/my.proj
est lié symboliquement à~/src/my.proj
, la commande ci-dessus va vous permettre de vous déplacer à~/src/my.proj
. Pourrait être un problème, si ce que vous voulez faire après ce n'est pas l'arbre agnostique.git-rev-parse
-- à cause de son nom, ce qui suggère qu'il est à propos de la transformation de révision du cahier des charges. BTW, je serais heureux de voirgit --work-tree
travail similaire àgit --exec-path[=<path>]
: "Si aucun chemin d'accès n'est donné, git va imprimer le réglage actuel"; au moins, de l'OMI, il serait logique de chercher une telle fonctionnalité.git exec
alias peut être combiné avecpwd
pour imprimer le répertoire racine:git exec pwd
.Ou parfois, il est utile d'avoir un shell interne est exécuté à la racine temporairement, et puis juste de exit pour revenir à la tâche d'origine.git config --global alias.top '!f() { GIT_TOP="${GIT_DIR%%/.git/modules/*}"; [ ".$GIT_TOP" != ".$GIT_DIR" ] && cd "$GIT_TOP"; exec "$@"; }; f'
et puisgit top pwd
.git
répertoire.git rev-parse && cd "$(git rev-parse --show-cdup)
ne fonctionne pas dans le cas général depuisgit rev-parse --show-cdup
retourne une chaîne vide dans le cas où vous êtes déjà dans le git du répertoire racine. Concequence est vous aller à votre maison.git rev-parse --show-toplevel > %TEMP%\GITROOT.TXT & SET /p BranchRoot=<%TEMP%\GITROOT.TXT & SET BranchRoot=%BranchRoot:/=\%
.git
répertoire (ou externe$GIT_DIR
d'un référentiel. Voir ma réponse pour celui qui travaille n'importe où dans un référentiel, et échoue en douceur en externe$GIT_DIR
git-rev-parse
: "Beaucoup de Git porcelainish commandes mélange d'indicateurs et de paramètres destinés à la sous-jacentes gitrev-list
commande qu'ils utilisent en interne, les drapeaux et les paramètres pour les autres commandes qu'ils utilisent en aval degit rev-list
. Cette commande est utilisée pour distinguer entre eux."cd ../../;git rev-parse --show-top level
La
man
page pourgit-config
(sous Alias) dit:Donc, sous UNIX, vous pouvez le faire:
.zshrc
, et j'définir l'alias " cg="cd $git(racine)", le $() de la partie obtient évalué à l'heure de la source, et toujours des points à ~/fichiers de configuration utilisateur, car c'est là que mon zshrc est..git/
répertoire. Ensuite, il retourne la racine de votre répertoire ainsi que partout où vous êtes dans.git/
command.com
(cmd
) pour faire des commits, mais sous Windows je suppose que vous voulezgit config --add alias.root '!cd'
ou sinon'!echo %CD%'
. Accepté de répondre, cependant, est le meilleur si vous avez besoin de la croix-compatibilité de plate-forme.A
--show-toplevel
que récemment été ajouté àgit rev-parse
ou pourquoi personne ne le mentionner?De la
git rev-parse
homme page:git-rev-parse
-- à cause de son nom, ce qui suggère qu'il est à propos de la transformation de révision du cahier des charges. BTW, je serais heureux de voirgit --work-tree
travail similaire àgit --exec-path[=<path>]
: "Si aucun chemin d'accès n'est donné, git va imprimer le réglage actuel"; au moins, de l'OMI, il serait logique de chercher une telle fonctionnalité.root = rev-parse --show-toplevel
dans votre gitconfig.git config --global alias.root "rev-parse --show-toplevel"
et puisgit root
sera en mesure de faire le travail--show-cdup
à--show-top-level
en Février 2011 (après cette réponse a été soumis).Comment à propos de "
git rev-parse --git-dir
" ?La
--git-dir
option semble fonctionner.De git rev-parse la page de manuel:
Vous pouvez le voir en action dans cette
git d'installation-sh
script.Si vous êtes dans un sous-module dossier, avec Git >=2.13, l'utilisation:
Si vous utilisez
git rev-parse --show-toplevel
, assurez-vous qu'il est avec Git 2.25+ (T1 2020)..git
si vous êtes déjà dans le répertoire racine. (Au moins, il n'sur msysgit.)(root=$(git rev-parse --git-dir)/ && cd ${root%%/.git/*} && git rev-parse && pwd)
mais ce n'est pas la couverture externe$GIT_DIR
s qui sont nommés autres que.git
Pour une solution complète, voir ma réponse ci-dessous..git/
dossier ci-dessous, leur dossier de niveau supérieur.À écrire une réponse simple ici, de sorte que nous pouvons utiliser
pour faire le travail, il suffit de configurer votre git en utilisant
et ensuite vous pouvez ajouter les lignes suivantes à votre
~/.bashrc
:de sorte que vous pouvez simplement utiliser
cdroot
pour aller vers le haut de votre repo.Si vous êtes déjà dans le premier niveau, ou pas dans un dépôt git
cd $(git rev-parse --show-cdup)
va vous ramener à la maison (juste le cd).cd ./$(git rev-parse --show-cdup)
est un moyen de fixation de la.cd "$(git rev-parse --show-cdup)"
. Cela fonctionne parce quecd ""
vous emmène nulle part, plutôt que de revenir$HOME
. Et c'est la meilleure pratique pour citer $() les invocations de toute façon, en cas de sortie de quelque chose avec des espaces (non pas que cette commande dans ce cas, tout de même).$PWD
. Cet exemple permettra de résoudre git est relatif à la racine de$PWD
au lieu derealpath $PWD
.Comme d'autres l'ont noté, le cœur de la solution est d'utiliser
git rev-parse --show-cdup
. Cependant, il existe quelques cas de bord à l'adresse:Lorsque le mdc est déjà à la racine de l'arbre de travail, la commande renvoie une chaîne vide.
en Fait, il se produit une ligne vide, mais la substitution de commande de dépouiller la fuite de saut de ligne. Le résultat final est une chaîne vide.
La plupart des réponses suggèrent ajoutant la sortie avec
./
de sorte qu'une sortie vide devient"./"
avant il est nourri auxcd
.Quand GIT_WORK_TREE est fixé à un emplacement qui n'est pas le parent de l'encéphalopathie des cervidés, le résultat peut être un chemin absolu.
Ajoutant
./
est mal dans cette situation. Si un./
est ajouté à un chemin absolu, il devient un chemin d'accès relatif (et ils le font uniquement référence à l'emplacement même si le mdc est le répertoire racine du système).La sortie peut contenir d'espaces.
Cela s'applique seulement dans le second cas, mais c'est une solution facile: utiliser des guillemets autour de la substitution de commande (et toute utilisation ultérieure de la valeur).
Comme d'autres réponses ont noté, nous pouvons faire
cd "./$(git rev-parse --show-cdup)"
, mais cela casse dans le deuxième cas limite (et le troisième cas de bord si nous avons laissé les guillemets).De nombreuses coquilles traiter
cd ""
comme un no-op, donc, pour ces coquilles que nous pourrions fairecd "$(git rev-parse --show-cdup)"
(les guillemets protéger la chaîne vide comme un argument dans le premier cas limite, et de préserver les espaces dans le troisième cas limite). POSIX dit le résultat decd ""
est pas spécifié, il peut être préférable, pour éviter de faire cette hypothèse.Une solution qui fonctionne dans tous les cas ci-dessus nécessite un test d'une certaine sorte. Le faire de manière explicite, il pourrait ressembler à ceci:
Pas
cd
est fait pour le premier cas de bord.Si il est acceptable d'exécuter
cd .
pour la première arête cas, la condition peut être fait dans l'expansion du paramètre:git root
' que la réponse ci-dessus vous utilise?Pour calculer le chemin absolu de l'actuel git répertoire racine, disons pour une utilisation dans un script shell, utilisez cette combinaison de readlink et git rev-parse:
git-rev-parse --show-cdup
vous donne le bon nombre de ".."sà la racine de votre cwd, ou la chaîne vide si vous êtes à la racine.
Puis ajouter le préfixe "./" pour faire face à la chaîne vide en cas et à l'utilisation
readlink -f
à traduire à un chemin d'accès complet.Vous pouvez également créer un
git-root
commande dans votre CHEMIN, comme un script shell pour appliquer cette technique:(Ci-dessus peut être collé dans un terminal pour créer git-utilisateur root et exécuter bits; le script est dans les lignes 2, 3 et 4.)
Et alors vous seriez en mesure d'exécuter
git root
d'obtenir la racine de votre arborescence actuelle.Notez que dans le script shell, utilisez l'option "-e" à cause de la coquille à la sortie si les rev-parse échoue, de sorte que vous pouvez bien obtenir le statut de sortie et le message d'erreur si vous n'êtes pas dans un répertoire git.
"$(git rev-parse ...)"
au lieu de hacks comme./$(git rev-parse ...)
.readlink -f
ne fonctionne pas de la même manière sur BSD. Voir ce SO pour les solutions de contournement. Le Python réponse sera probablement sans rien installer:python -c 'import os, sys; print(os.path.realpath(sys.argv[1]))' "$(git rev-parse --show-cdup)"
.Juste au cas où si vous êtes à l'alimentation de ce chemin vers le Git lui-même, l'utilisation
:/
Court de solutions qui fonctionnent avec des submodules, des crochets, et à l'intérieur de la
.git
répertoireVoici la réponse courte que la plupart se veulent:
Cela fonctionne n'importe où dans un git arbre de travail (y compris à l'intérieur de la
.git
répertoire), mais suppose que le répertoire de dépôt(s) sont appelés.git
(qui est la valeur par défaut). Avec submodules, il ira à la racine de la ultrapériphériques contenant référentiel.Si vous voulez obtenir à la racine de l'actuel sous-module utilisation:
Facilement exécuter une commande dans votre sous-module racine, en vertu de
[alias]
dans votre.gitconfig
, ajouter:Ceci vous permet de facilement faire des choses comme
git sh ag <string>
Solution robuste qui prend en charge différemment nommé ou externe
.git
ou$GIT_DIR
répertoires.Noter que
$GIT_DIR
peut pointer quelque part externe (et non.git
), d'où la nécessité de poursuivre la vérification.Mettre ceci dans votre
.bashrc
:L'exécuter en tapant
git_root
(après le redémarrage de votre shell:exec bash
)(root=$(git rev-parse --git-dir)/ && cd ${root%%/.git/*} && git rev-parse && pwd)
mais ce n'est pas la couverture externe$GIT_DIR
s qui sont nommés autres que.git
deleted by Community♦ Mar 2 at 0:00 (RemoveDeadQuestions)
shellcheck
propre.De modifier le "git config" réponse juste un peu:
et obtenir le chemin d'accès nettoyé. Très agréable.
Si vous êtes à la recherche d'un bon alias pour ce faire, en plus de ne pas sauter
cd
si vous n'êtes pas dans un git dir:git-extras
ajoute
$ git root
voir https://github.com/tj/git-extras/blob/master/Commands.md#git-root
Disponibilité de git-extras
$ brew install git-extras
$ apt-get install git-extras
Cette coque alias fonctionne si vous êtes dans un git subdir, ou au niveau supérieur:
mis à jour pour utiliser la syntaxe moderne au lieu de backticks:
Tout le reste échoue à un certain point, soit d'aller dans le répertoire ou juste lamentablement échouer. C'est le moyen le plus rapide et le plus court chemin pour revenir à la GIT_DIR.
$GIT_DIR
est détaché de la workingtree à l'aide de.git
-Fichiers etgitdir: SOMEPATH
. Par conséquent, cette échoue pour submodules, aussi, où$GIT_DIR
contient.git/modules/SUBMODULEPATH
.Voici un script que j'ai écrit qui gère les deux cas: 1) un référentiel avec un espace de travail, 2) dépôt nu.
https://gist.github.com/jdsumsion/6282953
git-root
(fichier exécutable dans votre chemin d'accès):J'espère que cela est utile.
git exec
idée est plus utile pour les non-nue dépôts. Cependant, ce script dans ma réponse gère le nu et non nu de cas correctement, ce qui pourrait être utile à quelqu'un, donc je pars de cette réponse ici.git submodule
s où$GIT_DIR
contient quelque chose comme/.git/modules/SUBMODULE
. Aussi vous supposez que le.git
répertoire fait partie de la worktree dans le non-nus cas.[alias] findroot = "!f () { [[ -d ".git" ]] && echo "Found git in [
pwd]" && exit 0; cd .. && echo "IN
pwd" && f;}; f"
git config --global alias.root '!pwd'
œuvres. J'ai été incapable de repérer les cas où il agit différemment non globales variante. (Unix, git 1.7.10.4) BTW: Votrefindroot
nécessite un/.git
pour éviter une récursivité sans fin.Depuis Git 2.13.0, il soutient une nouvelle option permettant d'afficher le chemin de la racine du projet, qui fonctionne même quand être utilisé à partir de l'intérieur d'un sous-module:
Pré-Configuré Aliases dans le Shell Cadres
Si vous utilisez un shell cadre, il y a peut-être déjà un shell alias disponibles:
$ grt
dans oh-my-zsh (68 k) (cd $(git rev-parse --show-toplevel || echo ".")
)$ git-root
dans prezto (8.8 k) (affiche le chemin du travail de la racine de l'arbre)$ g..
zimfw (1k) (change le répertoire courant pour le haut niveau de l'arbre de travail.)Je voulais étendre sur Daniel Brockman est excellent commentaire.
Définition
git config --global alias.exec '!exec '
vous permet de faire des choses commegit exec make
parce que, commeman git-config
états:Il est également utile de savoir que
$GIT_PREFIX
sera le chemin vers le répertoire par rapport au répertoire de niveau supérieur d'un référentiel. Mais, sachant qu'il est seulement la moitié de la bataille™. Shell extension variable qui rend un peu difficile à utiliser. Donc, je vous suggère d'utiliserbash -c
comme suit:autres commandes comprennent:
Au cas où quelqu'un a besoin d'un compatible POSIX façon de le faire, sans avoir besoin de
git
exécutable:git-root
:Si vous voulez juste la fonctionnalité dans le cadre d'un script, retirez le shebang, et de remplacer la dernière
git_root_recurse_parent
ligne avec:if
déclaration était censé vérifier si vous avez changé de répertoire dans la récursivité. Si elle reste dans le même répertoire, il est supposé que vous êtes coincé quelque part (par exemple,/
), les freins et la récursivité. Le bug est corrigé, et devrait maintenant fonctionner comme prévu. Merci pour ça.Eu à résoudre moi-même aujourd'hui. Résolu en C# que j'en avais besoin pour un programme, mais je pense que ça peut être esily réécrit. Considérer ce Domaine Public.