Ejecute git fetch después de cualquier comando cd

Ejecute git fetch después de cualquier comando cd

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:

  1. Ejecute algún código para cambiar el directorio actual. En zsh, pones este código en elchpwdfunción, o una función con un nombre diferente en la chpwd_functionsmatriz (ejemplo). VerEjecutar scripts bash al ingresar a un directoriopara una implementación de bash.
  2. Detecta copias de trabajo de git. Como solo estás interesado en git,Tu puedes corrergit 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.
  3. Correr git fetch.

Aquí hay una chpwdimplementación que se ejecuta git fetchal 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: .zshrcpara zsh, .bashrcpara bash (en bash también necesitaslos contenedores para invocar chpwdun 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í:

  1. Primero usamos function cd() {para anular el cdcomportamiento integrado con nuestro propio código personalizado.
  2. 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 incorporada cden lugar de llamar recursivamente a nuestra cd()función personalizada, y la proporcionamos $@como argumentos, que el shell expande. a todos los argumentos proporcionados a la función.
  3. Probamos si estamos en un repositorio git^ probando si el .gitdirectorio existe y, si es así, ejecutamos git fetch, diciéndole al shell que lo ponga en segundo plano agregando &.

Tenga en cuenta que la salida de git fetchaú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 builtinno 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 ~/.zshrcy ahora podrá cambiar de directorio con el comando cdgal que acaba de asignarle un alias.

Además, si no desea utilizarlo cdgy desea utilizarlo, simplemente cdcambie 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 &.

información relacionada