Führen Sie „git fetch“ nach jedem CD-Befehl aus.

Führen Sie „git fetch“ nach jedem CD-Befehl aus.

Ich muss „git fetch“ nach jedem CD-Befehl im Hintergrund ausführen und nur, wenn ich mich in einem Git-Verzeichnis befinde.

Antwort1

Dies besteht aus drei Teilen:

  1. Führen Sie einen Code aus, der das aktuelle Verzeichnis ändert. In zsh fügen Sie diesen Code in daschpwdFunktion, oder eine Funktion mit einem anderen Namen im chpwd_functionsArray (Beispiel). SehenFühren Sie Bash-Skripte beim Aufrufen eines Verzeichnisses ausfür eine Bash-Implementierung.
  2. Erkennen Sie Git-Arbeitskopien. Da Sie nur an Git interessiert sind,Du kannst rennengit rev-parse --show-toplevel. Es gibt fortgeschrittenere Frameworks zur Erkennung der Versionskontrolle, wenn Sie an anderen Versionskontrollsystemen interessiert sind.
  3. Laufen git fetch.

Hier ist eine chpwdImplementierung, die git fetchbeim Wechsel in ein Git-Repository ausgeführt wird.

chpwd () {
  set -- "$(git rev-parse --show-toplevel 2>/dev/null)"
  # If cd'ing into a git working copy and not within the same working copy
  if [ -n "$1" ] && [ "$1" != "$vc_root" ]; then
    vc_root="$1"
    git fetch
  fi
}
chpwd

Dieser Code kommt in Ihr Shell-Startskript: .zshrcfür zsh, .bashrcfür bash (in bash benötigen Sie außerdemdie Wrapper, die chpwdbei einem Verzeichniswechsel aufgerufen werden sollen).

Antwort2

Sie können eine Funktion verwenden:

function cd() {
    builtin cd "$@"
    if [[ -d .git ]]; then
        git fetch &
    fi
}

Fügen Sie dies der Startdatei Ihrer Shell hinzu.

Hier passieren ein paar Dinge:

  1. Zuerst function cd() {überschreiben wir das integrierte cdVerhalten durch unseren eigenen benutzerdefinierten Code.
  2. Natürlich möchten wir das Verzeichnis trotzdem ändern, also tun wir das zuerst – wir stellen ihm das Präfix builtin* voran, damit die Shell die integrierte Funktion verwendet, cdanstatt unsere benutzerdefinierte cd()Funktion rekursiv aufzurufen, und wir übergeben ihr $@die Argumente, die von der Shell zu allen der Funktion übergebenen Argumenten erweitert werden.
  3. Wir prüfen, ob wir uns in einem Git-Repository^ befinden, indem wir prüfen, ob das .gitVerzeichnis existiert. Wenn ja, führen wir aus und git fetchweisen die Shell durch Anhängen an, es im Hintergrund zu speichern &.

Beachten Sie, dass die Ausgabe git fetchweiterhin an das Terminal gesendet wird. Wenn Sie sie verwerfen möchten, können Sie stattdessen Folgendes verwenden:

git fetch & 2>&1 >/dev/null

Dadurch wird stderr in stdout umgeleitet und stdout wird dann an gesendet /dev/null.

[*]: Beachten Sie, dass dies builtinnicht in POSIX enthalten ist und diese Lösung daher nicht auf alle Shells portierbar ist.

[^]: Dies schlägt fehl, wenn das Git-Repository leer ist, aber Sie werden mit ziemlicher Sicherheit kein leeres Repository auf Ihrem Laufwerk haben, also wen kümmert das

Antwort3

Erstellen Sie eine Funktion in Ihrer .bashrc- oder .zshrc-Datei, die sich in Ihrem Home-Verzeichnis befindet.

Fügen Sie am Ende der Datei Folgendes hinzu:

cd_fetch() {
    command cd "$@"
    if [ -d .git ]; then
        git fetch & 
    fi
}
alias cdg=cd_fetch

Schließen Sie nun Ihr Terminal und öffnen Sie es erneut, oder führen Sie es aus. Jetzt können Sie mit dem gerade zugewiesenen source ~/.zshrcAliasbefehl das Verzeichnis ändern .cdg

Wenn Sie nicht verwenden möchten cdg, aber verwenden möchten, cdändern Sie einfach die Aliasdefinition in alias cd=cd_fetch.

Bei diesem Ansatz wird weiterhin alles ausgegeben, was Git Fetch normalerweise tut. Um es stumm zu schalten, ersetzen Sie die git fetch &Zeile durch git fetch 2>&1 >/dev/null &.

verwandte Informationen