web-dev-qa-db-fra.com

Vérifier si le répertoire actuel est un référentiel Git

J'écris une série de scripts pour la gestion de Git en zsh.

Comment vérifier si le répertoire actuel est un référentiel Git? (Lorsque je ne suis pas dans un dépôt Git, je ne veux pas exécuter un ensemble de commandes et obtenir un ensemble de réponses fatal: Not a git repository).

136
anon

Voici une façon naïve de le copier depuis le fichier d'achèvement de bash.

# Copyright (C) 2006,2007 Shawn O. Pearce <[email protected]>
# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
# Distributed under the GNU General Public License, version 2.0.

if [ -d .git ]; then
  echo .git;
else
  git rev-parse --git-dir 2> /dev/null;
fi;

Vous pouvez soit envelopper cela dans une fonction, soit l'utiliser dans un script.

Condensé dans une condition d'une ligne adaptée à bash ou zsh

[ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1
124
jabbie

Vous pouvez utiliser:

git rev-parse --is-inside-work-tree

Ce qui imprimera 'true' si vous êtes dans une arborescence de travail git repos.

Notez qu'il renvoie toujours la sortie vers STDERR si vous êtes en dehors d'un dépôt Git (et n'imprime pas 'false').

Tiré de cette réponse: https://stackoverflow.com/a/2044714/12983

81
TM.

Utilisez git rev-parse --git-dir

 if git rev-parse --git-dir>/dev/null 2> & 1; puis
 : # Ceci est un dépôt git valide (mais le répertoire en cours 
 # N'est peut-être pas le niveau supérieur .
 # Vérifiez le résultat de la commande git rev-parse si vous en tenez compte). : # ce n'est pas un dépôt git 
 fi 
38
William Pursell

Ou vous pouvez faire ceci:

inside_git_repo="$(git rev-parse --is-inside-work-tree 2>/dev/null)"

if [ "$inside_git_repo" ]; then
  echo "inside git repo"
else
  echo "not in git repo"
fi
14
Alex Cory

Pas sûr s'il existe un moyen accessible au public/documenté de le faire (il y a quelques fonctions internes de git que vous pouvez utiliser/abuser dans la source git elle-même)

Vous pourriez faire quelque chose comme;

if ! git ls-files >& /dev/null; then
  echo "not in git"
fi
5
James

Une autre solution consiste à vérifier le code de sortie de la commande.

git rev-parse 2> /dev/null; [ $? == 0 ] && echo 1

Cela imprimera 1 si vous êtes dans un dossier du référentiel git.

5
user2095363

Une option très rapide est http://vc.gerg.ca/hg/vcprompt/ .. multi-VC, en C, pas de dépendances autres que lui-même.

3
peritus

Avez-vous vérifié les fonctions déjà dans la distribution zsh? Voir cette entrée de blog à propos de vcs_info dans zsh.

METTRE &AGRAVE; JOUR:

Il semble que le lien d'origine ait été supprimé et l'auteur a changé de domaine principal. J'ai vérifié sur Google et je pense que les publications actuellement liées ont le même contenu, mais je ne sais pas avec certitude (il y a longtemps que j'ai vérifié le lien d'origine).

2
MBO

cela fonctionne pour moi. Vous obtenez toujours les erreurs mais elles sont assez faciles à supprimer. cela fonctionne aussi à partir de sous-dossiers!

statut git>/dev/null 2> & 1 && echo Bonjour tout le monde!

Vous pouvez mettre cela dans une déclaration if then si vous devez conditionnellement en faire plus.

1
CharlesTWall3

Vous pouvez ajouter ou remplacer votre $ PS1 dans votre zshrc par les outils un ou un autre git-Prompt. De cette façon, vous pouvez facilement savoir si vous êtes dans un dépôt git et si l'état du dépôt est en cours.

1
jxqz

# vérifier si git repo

if [ $(git rev-parse --is-inside-work-tree) = true ]; then
    echo "yes, is a git repo"
    git pull
else
    echo "no, is not a git repo"
    git clone url --depth 1
fi
0
Pascal Andy

Pourquoi ne pas utiliser les codes de sortie? Si un référentiel git existe dans le répertoire en cours, les commandes git branch et git tag renvoient un code de sortie de 0; sinon, un code de sortie différent de zéro sera renvoyé. De cette façon, vous pouvez déterminer si un référentiel git existe ou non. Simplement, vous pouvez exécuter:

git tag > /dev/null 2>&1 && [ $? -eq 0 ]

Avantage: Flexibe. Cela fonctionne à la fois pour les dépôts nus et non nus, et pour sh, zsh et bash.

Explication

  1. git tag: Obtention des balises du référentiel pour déterminer s'il existe ou non.
  2. > /dev/null 2>&1: Empêcher d'imprimer quoi que ce soit, y compris les sorties normales et d'erreur.
  3. [ $? -eq 0 ]: Vérifie 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 passé. $? obtient le code de sortie de la commande précédente et [, -eq et ] effectuent 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:

#!/bin/sh

if git tag > /dev/null 2>&1 && [ $? -eq 0 ]; then
    echo "Repository exists!";
else
    echo "No repository here.";
fi
0
MAChitgarha

Cette réponse fournit un exemple de fonction POSIX Shell et un exemple d'utilisation pour compléter les réponses de @ jabbie answer .

is_inside_git_repo() {
    git rev-parse --is-inside-work-tree >/dev/null 2>&1
}

git renvoie errorlevel 0 s'il se trouve dans un référentiel git, sinon il renvoie errorlevel 128. (Il renvoie également true ou false s'il se trouve dans un référentiel git.)

Exemple d'utilisation

for repo in *; do
    # skip files
    [ -d "$repo" ] || continue
    # run commands in subshell so each loop starts in the current dir
    (
        cd "$repo"
        # skip plain directories
        is_inside_git_repo || continue
        printf '== %s ==\n' "$repo"
        git remote update --Prune 'Origin' # example command
        # other commands here
    )
done
0
go2null

Basé sur la réponse de @Alex Cory :

[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]

ne contient aucune opération redondante et fonctionne en mode -e.

  • Comme @ go2null l'a noté , cela ne fonctionnera pas dans un dépôt simple. Si vous souhaitez utiliser un référentiel nu pour une raison quelconque, vous pouvez simplement vérifier si git rev-parse réussit, en ignorant sa sortie .
    • Je ne considère pas cela comme un inconvénient, car la ligne ci-dessus est en retrait pour les scripts et pratiquement toutes les commandes git ne sont valides que dans une arborescence. Donc, aux fins de script, il est fort probable que vous souhaitiez être non seulement dans un "repo git", mais également dans une arborescence.
0
ivan_pozdeev