J'écris une série de scripts pour la gestion de Git dans zsh.
Comment vérifier si le répertoire courant est un référentiel Git? (Quand je ne suis pas dans un dépôt Git, je ne veux pas exécuter un tas de commandes et obtenir un tas de fatal: Not a git repository
réponses).
$GIT_DIR
ou$GIT_WORK_TREE
variables d' environnement, ou la façon dont ils interagissent.Réponses:
Copié à partir du fichier d'achèvement bash, ce qui suit est une façon naïve de le faire
Vous pouvez soit envelopper cela dans une fonction, soit l'utiliser dans un script.
Condensé dans une condition d'une ligne adaptée à bash et zsh
la source
git rev-parse --is-inside-git-dir
. J'utilise personnellementgit rev-parse --is-inside-work-tree
avant de régler ma PS1.--is-inside-git-dir
ne retournera true que si vous êtes réellement dans le.git
répertoire d'un référentiel. Je ne pense pas que le PO recherche cela.--is-inside-work-tree
ni--is-inside-git-dir
ne fonctionnera lorsque vous êtes en dehors d'un dépôt git. voir: groups.google.com/forum/#!topic/git-users/dWc23LFhWxE.git
. Pour la robustesse, omettez le[ -d .git ]
et utilisez simplementgit rev-parse ...
.Vous pouvez utiliser:
Ce qui sera affiché `` vrai '' si vous êtes dans une arborescence de travail git repos.
Notez qu'il retourne toujours la sortie à STDERR si vous êtes en dehors d'un dépôt git (et n'imprimez pas 'false').
Tiré de cette réponse: https://stackoverflow.com/a/2044714/12983
la source
git rev-parse --show-toplevel
correspondance avec le sous-dossier que je vérifieUtilisez git rev-parse --git-dir
la source
Ou vous pouvez le faire:
la source
-e
mode:[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]
Je ne sais pas s'il existe un moyen accessible au public / documenté de le faire (il existe certaines fonctions internes de git que vous pouvez utiliser / abuser dans la source git elle-même)
Vous pourriez faire quelque chose comme;
la source
D' après la réponse de @Alex Cory :
ne contient aucune opération redondante et fonctionne en
-e
mode.git rev-parse
réussite, en ignorant sa sortie.git
commandes ne sont valides qu'à l'intérieur d'un arbre de travail. Donc, à des fins de script, vous êtes probablement intéressé non seulement à l'intérieur d'un "git repo" mais à l'intérieur d'un worktree.la source
[
du tout.if git rev-parse --is-inside-work-tree; then ...
Une autre solution consiste à vérifier le code de sortie de la commande.
Cela affichera 1 si vous êtes dans un dossier de référentiel git.
la source
.git
répertoire - que vous souhaitiez ou non.git rev-parse 2>&-
.Cette réponse fournit un exemple de fonction shell POSIX et un exemple d'utilisation pour compléter la réponse de @ jabbie .
git
renvoie errorlevel0
s'il se trouve dans un référentiel git, sinon il renvoie errorlevel128
. (Il retourne égalementtrue
oufalse
s'il se trouve dans un référentiel git.)Exemple d'utilisation
la source
.git
, il réussira mais s'imprimerafalse
.git rev-parse --is-inside-work-tree
rendementtrue
oufalse
alors il est dans un git, et c'est - ce que la fonction retourne. c'est-à-dire que la fonction est correctecela fonctionne pour moi. Vous obtenez toujours les erreurs mais elles sont assez faciles à supprimer. cela fonctionne également à partir des sous-dossiers!
git status> / dev / null 2> & 1 && echo Bonjour tout le monde!
Vous pouvez mettre cela dans une instruction if then si vous devez en faire plus conditionnellement.
la source
git status
peut être très lent sur un gros / vieux dépôt. Je ne l'utiliserais pas à cette fin.Pourquoi ne pas utiliser les codes de sortie? Si un référentiel git existe dans le répertoire courant, alors
git branch
et lesgit tag
commandes renvoient le code de sortie de 0; sinon, un code de sortie différent de zéro sera retourné. De cette façon, vous pouvez déterminer si un référentiel git existe ou non. Vous pouvez simplement exécuter:Avantage : Flexibe. Il fonctionne pour les référentiels nus et non nus, ainsi que pour sh, zsh et bash.
Explication
git tag
: Obtenir des balises du référentiel pour déterminer s'il existe ou non.> /dev/null 2>&1
: Empêche d'imprimer quoi que ce soit, y compris les sorties normales et d'erreur.[ $? -eq 0 ]
: Vérifiez si la commande précédente est retournée avec le code de sortie 0 ou non. Comme vous le savez peut-être, chaque sortie non nulle signifie que quelque chose de mauvais s'est produit.$?
obtient le code de sortie de la commande précédente, et[
,-eq
et]
effectue la comparaison.Par exemple, vous pouvez créer un fichier nommé
check-git-repo
avec le contenu suivant, le rendre exécutable et l'exécuter:la source
# vérifier si git repo
la source
[
ici. Faites juste:if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then ....
Merci ivan_pozdeev , maintenant j'ai un test si à l'intérieur du répertoire .git le code ne fonctionnera pas donc aucune erreur imprimée ou faux statut de sortie.
Les tests " ! [[$ (Pwd) = .git / || $ (pwd) = * .git]] " "si vous n'êtes pas dans un dépôt .git alors il exécutera la commande git. La commande de type intégré est utilisée pour vérifier si vous avez installé git ou s'il se trouve dans votre PATH. voir le type d'aide
la source
Comment ça:
la source
Vous pouvez ajouter ou remplacer votre $ PS1 dans votre zshrc avec l' un ou l' autre des outils git-prompt. De cette façon, vous pouvez être facilement informé de si vous êtes dans un dépôt git et de l'état du dépôt.
la source
Le ! nie donc même si vous l'exécutez dans un répertoire qui n'est pas un dépôt git, cela ne vous donnera pas d'erreurs fatales
Le > / dev / null 2> & 1 envoie les messages à / dev / null puisque vous êtes juste après l'état de sortie. Les {} sont pour les groupes de commandes, donc toutes les commandes après le || fonctionnera si git rev-parse a réussi puisque nous utilisons a! ce qui annule le statut de sortie de git rev-parse. Le printf est juste pour imprimer un message et un statut git pour imprimer le statut du dépôt.
Enveloppez-le dans une fonction ou mettez-le dans un script. J'espère que cela t'aides
la source
.git
, il réussira mais s'imprimerafalse
.