Necesito ejecutar git fetch después de cualquier comando cd en segundo plano y solo si estoy en un directorio git.
Respuesta1
Hay tres partes en esto:
- Ejecute algún código para cambiar el directorio actual. En zsh, pones este código en el
chpwd
función, o una función con un nombre diferente en lachpwd_functions
matriz (ejemplo). VerEjecutar scripts bash al ingresar a un directoriopara una implementación de bash. - Detecta copias de trabajo de git. Como solo estás interesado en git,Tu puedes correr
git rev-parse --show-toplevel
. Existen marcos más avanzados para detectar el control de versiones si está interesado en otros sistemas de control de versiones. - Correr
git fetch
.
Aquí hay una chpwd
implementación que se ejecuta git fetch
al cambiar a un repositorio de git.
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
Este código va en el script de inicio de tu shell: .zshrc
para zsh, .bashrc
para bash (en bash también necesitaslos contenedores para invocar chpwd
un cambio de directorio).
Respuesta2
Puedes usar una función:
function cd() {
builtin cd "$@"
if [[ -d .git ]]; then
git fetch &
fi
}
Agregue esto al archivo de inicio de su shell.
Hay un par de cosas que están sucediendo aquí:
- Primero usamos
function cd() {
para anular elcd
comportamiento integrado con nuestro propio código personalizado. - Obviamente todavía queremos cambiar el directorio, así que lo hacemos primero: le ponemos el prefijo
builtin
* para que el shell use la función incorporadacd
en lugar de llamar recursivamente a nuestracd()
función personalizada, y la proporcionamos$@
como argumentos, que el shell expande. a todos los argumentos proporcionados a la función. - Probamos si estamos en un repositorio git^ probando si el
.git
directorio existe y, si es así, ejecutamosgit fetch
, diciéndole al shell que lo ponga en segundo plano agregando&
.
Tenga en cuenta que la salida de git fetch
aún se enviará al terminal. Si deseas descartarlo, puedes usar esto en su lugar:
git fetch & 2>&1 >/dev/null
Esto redirige stderr a stdout y luego envía stdout a /dev/null
.
[*]: Tenga en cuenta que builtin
no está en POSIX y, por lo tanto, esta solución no es portátil en todos los shells.
[^]: Esto falla si el repositorio de git está vacío, pero es casi seguro que no tendrás un repositorio vacío en tu disco, entonces, ¿a quién le importa?
Respuesta3
cree una función en su archivo .bashrc o .zshrc que se encuentra en su directorio de inicio.
Agregue lo siguiente al final del archivo:
cd_fetch() {
command cd "$@"
if [ -d .git ]; then
git fetch &
fi
}
alias cdg=cd_fetch
Ahora cierre y vuelva a abrir su terminal o ejecútelo source ~/.zshrc
y ahora podrá cambiar de directorio con el comando cdg
al que acaba de asignarle un alias.
Además, si no desea utilizarlo cdg
y desea utilizarlo, simplemente cd
cambie la definición del alias a alias cd=cd_fetch
.
Este enfoque seguirá generando todo lo que normalmente hace git fetch, para silenciarlo reemplace la git fetch &
línea for git fetch 2>&1 >/dev/null &
.