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
).
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
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
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
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
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
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.
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.
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).
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.
# 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
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.
git tag
: Obtention des balises du référentiel pour déterminer s'il existe ou non.> /dev/null 2>&1
: Empêcher d'imprimer quoi que ce soit, y compris les sorties normales et d'erreur.[ $? -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
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
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
.
git rev-parse
réussit, en ignorant sa sortie .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.