Controllare se la directory corrente è un repository Git
Domanda
Sto scrivendo una serie di script per la gestione del Git in zsh.
Come si controlla se la directory corrente è un repository Git? (Quando non sono in un repo Git, non voglio per eseguire una serie di comandi e ottenere un mucchio di risposte fatal: Not a git repository
).
Soluzione
Copiato dal file di completamento bash il seguente è un modo ingenuo per farlo
# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
# 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;
Si potrebbe o avvolgere che in una funzione o usarlo in uno script.
condensato in una condizione di una linea adatto per bash o zsh
[ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1
Altri suggerimenti
È possibile utilizzare:
git rev-parse --is-inside-work-tree
che stamperà 'vero' se ci si trova in un albero di lavoro repo git.
Si noti che restituisce ancora output STDERR se si è al di fuori di un repo git (e non stampare 'falso').
Tratto da questa risposta: https://stackoverflow.com/a/2044714/12983
Usa git rev-parse --git-dir
if git rev-parse --git-dir > /dev/null 2>&1; then : # This is a valid git repository (but the current working # directory may not be the top level. # Check the output of the git rev-parse command if you care) else : # this is not a git repository fi
Oppure si potrebbe fare questo:
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
Non so se c'è un / modo accessibile al pubblico documentato per fare questo (ci sono alcune funzioni interne git che è possibile utilizzare / abuso nella sorgente git stesso)
Si potrebbe fare qualcosa di simile;
if ! git ls-files >& /dev/null; then
echo "not in git"
fi
Un'altra soluzione è quella di verificare la presenza di codice di uscita del comando.
git rev-parse 2> /dev/null; [ $? == 0 ] && echo 1
Questo stamperà 1 se siete in una cartella del repository git.
In base a risposta di @alex Cory :
[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]
non contiene operazioni ridondanti e funziona in modalità -e
.
- Come @ go2null notato , questo non funzionerà in un repo nudo. Se si desidera lavorare con un repo nuda per qualsiasi motivo, si può solo verificare la presenza di
git rev-parse
successo, ignorando la sua uscita.- non ritengo questo un inconveniente perché la linea sopra concepito per l'scripting, e praticamente tutti i comandi
git
sono valide solo all'interno di un worktree. Quindi, per scopi di scripting, si è più probabile interessati ad essere non solo all'interno di un "git repo", ma all'interno di un worktree.
- non ritengo questo un inconveniente perché la linea sopra concepito per l'scripting, e praticamente tutti i comandi
questo funziona per me. È ancora ottenere gli errori, ma sono abbastanza facili da sopprimere. funziona anche da dentro le sottocartelle!
git status> / dev / null 2> & 1 && echo Ciao Mondo!
Si può mettere questo in una dichiarazione, se poi se è necessario fare in modo condizionale di più.
È possibile aggiungere o sostituire il vostro $ PS1 nel vostro zshrc con uno o altri strumenti git-prompt. In questo modo si può essere comodamente al corrente di se siete in un repo git e lo stato del pronti contro termine è in.
Questa risposta fornisce un esempio la funzione POSIX shell e un esempio di utilizzo per completare @ risposta di Jabbie .
is_inside_git_repo() {
git rev-parse --is-inside-work-tree >/dev/null 2>&1
}
git
rendimenti errorlevel 0
se è all'interno di un repository git, altrimenti restituisce 128
errorlevel. (Inoltre restituisce true
o false
se è all'interno di un repository git.)
Esempio di utilizzo
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
# controllo se 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
Perché non utilizzare codici di uscita? Se un repository git esiste nella directory corrente, allora i comandi git branch
e git tag
restituiscono codice di uscita 0; altrimenti, verrà restituito un codice di uscita diverso da zero. In questo modo, è possibile determinare se un repository git esistono o meno. Semplicemente, è possibile eseguire:
git tag > /dev/null 2>&1 && [ $? -eq 0 ]
Advantage : flexibe. Funziona per entrambi i repository nudi e non-nude, e in sh, zsh e bash.
Spiegazione
-
git tag
:. Ottenere Tags di repository per determinare se esiste o no -
> /dev/null 2>&1
:. Impedire dalla stampa qualsiasi cosa, anche le uscite normali e di errore -
[ $? -eq 0 ]
: Controllare se il comando precedente ritorna con codice di uscita 0 o meno. Come forse sapete, ogni non-zero significa uscita successo qualcosa di brutto.$?
ottiene il codice di uscita del comando precedente, e[
,-eq
e]
eseguire il confronto.
A titolo di esempio, è possibile creare un file denominato check-git-repo
con il seguente contenuto, renderlo eseguibile e lanciarlo:
#!/bin/sh
if git tag > /dev/null 2>&1 && [ $? -eq 0 ]; then
echo "Repository exists!";
else
echo "No repository here.";
fi
! git rev-parse --is-inside-work-tree >/dev/null 2>&1 || {
printf '%s\n\n' "GIT repository detected." && git status
}
L'! nega quindi, anche se si esegue questo in una directory che non è un git repo che non vi darà alcuni errori fatali
Il > / dev / null 2> & 1 invia i messaggi a / dev / null dal momento che sei appena dopo lo stato di uscita. Il {} sono per gruppi di comando in modo da tutti i comandi dopo il || verrà eseguito se il git-rev parse riuscito poiché usiamo una! che negato lo stato di uscita di git rev-parse. Il printf è solo per stampare qualche messaggio e git status per verificare lo stato del pronti contro termine.
avvolgerla in una funzione o metterlo in uno script. Spero che questo aiuti