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:
- Führen Sie einen Code aus, der das aktuelle Verzeichnis ändert. In zsh fügen Sie diesen Code in das
chpwd
Funktion, oder eine Funktion mit einem anderen Namen imchpwd_functions
Array (Beispiel). SehenFühren Sie Bash-Skripte beim Aufrufen eines Verzeichnisses ausfür eine Bash-Implementierung. - Erkennen Sie Git-Arbeitskopien. Da Sie nur an Git interessiert sind,Du kannst rennen
git rev-parse --show-toplevel
. Es gibt fortgeschrittenere Frameworks zur Erkennung der Versionskontrolle, wenn Sie an anderen Versionskontrollsystemen interessiert sind. - Laufen
git fetch
.
Hier ist eine chpwd
Implementierung, die git fetch
beim 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: .zshrc
für zsh, .bashrc
für bash (in bash benötigen Sie außerdemdie Wrapper, die chpwd
bei 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:
- Zuerst
function cd() {
überschreiben wir das integriertecd
Verhalten durch unseren eigenen benutzerdefinierten Code. - 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,cd
anstatt unsere benutzerdefiniertecd()
Funktion rekursiv aufzurufen, und wir übergeben ihr$@
die Argumente, die von der Shell zu allen der Funktion übergebenen Argumenten erweitert werden. - Wir prüfen, ob wir uns in einem Git-Repository^ befinden, indem wir prüfen, ob das
.git
Verzeichnis existiert. Wenn ja, führen wir aus undgit fetch
weisen die Shell durch Anhängen an, es im Hintergrund zu speichern&
.
Beachten Sie, dass die Ausgabe git fetch
weiterhin 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 builtin
nicht 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 ~/.zshrc
Aliasbefehl 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 &
.