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).

È stato utile?

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.

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

  1. git tag:. Ottenere Tags di repository per determinare se esiste o no
  2. > /dev/null 2>&1:. Impedire dalla stampa qualsiasi cosa, anche le uscite normali e di errore
  3. [ $? -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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top