Execute git fetch após qualquer comando cd

Execute git fetch após qualquer comando cd

Preciso executar git fetch após qualquer comando cd em segundo plano e somente se estiver em um diretório git.

Responder1

Existem três partes para isso:

  1. Execute algum código para alterar o diretório atual. No zsh, você coloca esse código nochpwdfunção, ou uma função com um nome diferente na chpwd_functionsmatriz (exemplo). VerExecute scripts bash ao entrar em um diretóriopara uma implementação bash.
  2. Detecte cópias de trabalho do git. Como você está interessado apenas em git,você pode corrergit rev-parse --show-toplevel. Existem estruturas mais avançadas para detectar o controle de versão se você estiver interessado em outros sistemas de controle de versão.
  3. Correr git fetch.

Aqui está uma chpwdimplementação que é executada git fetchao mudar para um repositório 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 vai para o seu script de inicialização do shell: .zshrcpara zsh, .bashrcpara bash (no bash você também precisaos wrappers para chamar chpwdem uma mudança de diretório).

Responder2

Você pode usar uma função:

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

Adicione isto ao arquivo de inicialização do seu shell.

Há algumas coisas que estão acontecendo aqui:

  1. Primeiro, usamos function cd() {para substituir o cdcomportamento interno por nosso próprio código personalizado.
  2. Obviamente, ainda queremos alterar o diretório, então fazemos isso primeiro - prefixamos builtin* para que o shell use o builtin cdem vez de chamar recursivamente nossa cd()função personalizada, e o fornecemos $@como argumentos, que são expandidos pelo shell a todos os argumentos fornecidos à função.
  3. Testamos se estamos em um repositório git^ testando se o .gitdiretório existe e, se existir, executamos git fetch, dizendo ao shell para colocá-lo em segundo plano anexando &.

Observe que a saída de git fetchainda será enviada para o terminal. Se você deseja descartá-lo, você pode usar isto:

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

Isso redireciona o stderr para o stdout e, em seguida, envia o stdout para o /dev/null.

[*]: Observe que builtinnão está em POSIX e, portanto, esta solução não é portátil em todos os shells

[^]: Isso falhará se o repositório git estiver vazio, mas é quase certo que você não terá um repositório vazio em sua unidade, então quem se importa

Responder3

crie uma função em seu arquivo .bashrc ou .zshrc que está em seu diretório inicial.

Adicione o seguinte ao final do arquivo:

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

Agora feche e reabra seu terminal ou execute source ~/.zshrce agora você pode alterar o diretório com o comando cdgque acabou de criar o alias.

Além disso, se você não quiser usar cdge quiser usar, basta cdalterar a definição do alias para alias cd=cd_fetch.

Essa abordagem ainda produzirá tudo o que o git fetch normalmente faz, para silenciá-lo, substitua a git fetch &linha for git fetch 2>&1 >/dev/null &.

informação relacionada