Ich schreibe eine Reihe von Skripten für das Git-Management in zsh.
Wie überprüfe ich, ob das aktuelle Verzeichnis ein Git-Repository ist? (Wenn ich nicht in einem Git-Repo bin, möchte ich nicht eine Reihe von Befehlen ausführen und eine Reihe von fatal: Not a git repository
Antworten erhalten).
$GIT_DIR
oder$GIT_WORK_TREE
Umgebungsvariablen oder deren Interaktion.Antworten:
Das Folgende ist eine naive Methode, die aus der Bash-Abschlussdatei kopiert wurde
Sie können dies entweder in eine Funktion einschließen oder in einem Skript verwenden.
In einem einzeiligen Zustand zusammengefasst, der für Bash und Zsh geeignet ist
quelle
git rev-parse --is-inside-git-dir
. Ich persönlich benutzegit rev-parse --is-inside-work-tree
vor dem Einstellen meiner PS1.--is-inside-git-dir
gibt nur dann true zurück, wenn Sie sich tatsächlich im.git
Verzeichnis eines Repositorys befinden. Ich glaube nicht, dass das OP danach sucht.--is-inside-work-tree
noch--is-inside-git-dir
funktioniert es, wenn Sie sich außerhalb eines Git-Repo befinden. Siehe: groups.google.com/forum/#!topic/git-users/dWc23LFhWxE.git
. Lassen Sie aus Gründen der Robustheit das weg[ -d .git ]
und verwenden Sie es einfachgit rev-parse ...
.Sie können verwenden:
Was 'true' ausgibt, wenn Sie sich in einem Arbeitsbaum für Git-Repos befinden.
Beachten Sie, dass die Ausgabe weiterhin an STDERR zurückgegeben wird, wenn Sie sich außerhalb eines Git-Repos befinden (und nicht 'false' drucken).
Aus dieser Antwort entnommen: https://stackoverflow.com/a/2044714/12983
quelle
git rev-parse --show-toplevel
Übereinstimmungen mit dem von mir überprüften UnterordnerVerwenden Sie git rev-parse --git-dir
quelle
Oder Sie könnten dies tun:
quelle
-e
Modus:[ "$(git rev-parse --is-inside-work-tree 2>/dev/null)" == "true" ]
Ich bin mir nicht sicher, ob es eine öffentlich zugängliche / dokumentierte Möglichkeit gibt, dies zu tun (es gibt einige interne Git-Funktionen, die Sie in der Git-Quelle selbst verwenden / missbrauchen können).
Sie könnten so etwas tun;
quelle
Basierend auf der Antwort von @Alex Cory :
enthält keine redundanten Operationen und arbeitet im
-e
Modus.git rev-parse
, ob dies erfolgreich ist, und die Ausgabe ignorieren.git
Befehle nur innerhalb eines Arbeitsbaums gültig sind. Für Skriptzwecke sind Sie höchstwahrscheinlich daran interessiert, nicht nur in einem "Git Repo", sondern auch in einem Arbeitsbaum zu sein.quelle
[
. Tun Sie es einfachif git rev-parse --is-inside-work-tree; then ...
(mit Weiterleitungen wie gewünscht)Eine andere Lösung besteht darin, nach dem Exit-Code des Befehls zu suchen.
Dies gibt 1 aus, wenn Sie sich in einem Git-Repository-Ordner befinden.
quelle
.git
Verzeichnis befinden - was Sie vielleicht wollen oder nicht.git rev-parse 2>&-
.Diese Antwort enthält ein Beispiel für eine POSIX-Shell-Funktion und ein Verwendungsbeispiel zur Ergänzung der Antwort von @ jabbie .
git
Gibt die Fehlerstufe zurück,0
wenn es sich in einem Git-Repository befindet128
. Andernfalls wird die Fehlerstufe zurückgegeben . (Es wird auch zurückgegebentrue
oderfalse
wenn es sich in einem Git-Repository befindet.)Anwendungsbeispiel
quelle
.git
wird es aber drucken gelingenfalse
.git rev-parse --is-inside-work-tree
zurückgegeben wirdtrue
oderfalse
dann befindet es sich in einem Git-Repo, und genau das gibt die Funktion zurück. Das heißt, die Funktion ist korrektdas funktioniert bei mir. Sie erhalten immer noch die Fehler, aber sie sind leicht zu unterdrücken. Es funktioniert auch in Unterordnern!
Git-Status> / dev / null 2> & 1 && echo Hallo Welt!
Sie können dies in eine if then-Anweisung einfügen, wenn Sie bedingt mehr tun müssen.
quelle
git status
kann auf einem großen / alten Repo sehr langsam sein. Ich würde es nicht für diesen Zweck verwenden.Warum nicht Exit-Codes verwenden? Wenn im aktuellen Verzeichnis ein Git-Repository vorhanden ist, geben die Befehle
git branch
und dengit tag
Exit-Code 0 zurück. Andernfalls wird ein Exit-Code ungleich Null zurückgegeben. Auf diese Weise können Sie feststellen, ob ein Git-Repository vorhanden ist oder nicht. Sie können einfach ausführen:Vorteil : Flexibe. Es funktioniert sowohl für nackte als auch für nicht nackte Repositorys sowie in sh, zsh und bash.
Erläuterung
git tag
: Tags des Repositorys abrufen, um festzustellen, ob sie vorhanden sind oder nicht.> /dev/null 2>&1
: Verhindern, dass etwas gedruckt wird, einschließlich normaler und Fehlerausgaben.[ $? -eq 0 ]
: Überprüfen Sie, ob der vorherige Befehl mit dem Exit-Code 0 zurückgegeben wurde oder nicht. Wie Sie vielleicht wissen, bedeutet jeder Ausgang ungleich Null, dass etwas Schlimmes passiert ist.$?
erhält den Beendigungscode des vorherigen Befehls, und[
,-eq
und]
den Vergleich durchzuführen.Sie können beispielsweise eine Datei
check-git-repo
mit dem folgenden Inhalt erstellen , sie ausführbar machen und ausführen:quelle
# Überprüfen Sie, ob Git Repo
quelle
[
werden. Tun Sie einfach:if git rev-parse --is-inside-work-tree > /dev/null 2>&1; then ....
Vielen Dank ivan_pozdeev . Jetzt habe ich einen Test, ob der Code im Verzeichnis .git nicht ausgeführt wird, sodass keine Fehler ausgedruckt werden oder der Status falsch beendet wird.
Das " ! [[$ (Pwd) = .git / || $ (pwd) = * .git]] " testet, wenn Sie sich nicht in einem .git- Repo befinden, und führt den Befehl git aus. Mit dem integrierten Befehl type können Sie überprüfen, ob git installiert ist oder sich in Ihrem PATH befindet. siehe Hilfetyp
quelle
Wie wäre es damit:
quelle
Sie können Ihre $ PS1 in Ihrem zshrc durch das eine oder andere git-prompt- Tool ergänzen oder ersetzen . Auf diese Weise können Sie bequem feststellen, ob Sie sich in einem Git-Repo befinden und in welchem Zustand sich das Repo befindet.
quelle
Das ! negiert dies. Selbst wenn Sie dies in einem Verzeichnis ausführen, das kein Git-Repo ist, werden Ihnen keine schwerwiegenden Fehler angezeigt
Das > / dev / null 2> & 1 sendet die Nachrichten an / dev / null, da Sie sich gerade nach dem Exit-Status befinden. Die {} sind für Befehlsgruppierungen, also alle Befehle nach dem || wird ausgeführt, wenn die git rev-parse erfolgreich war, da wir a! was den Exit-Status von git rev-parse negierte. Der printf dient nur zum Drucken einer Nachricht und des Git-Status, um den Status des Repos zu drucken.
Wickeln Sie es in eine Funktion ein oder fügen Sie es in ein Skript ein. Hoffe das hilft
quelle
.git
wird es aber drucken gelingenfalse
.