Execute o git fetch após qualquer comando cd

1

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

    
por north.mister 02.11.2016 / 22:58

3 respostas

2

Existem três partes para isso:

  1. Execute algum código para alterar o diretório atual. Em zsh, você coloca esse código na % funçãochpwd . Consulte Executar scripts bash ao inserir um diretório para uma implementação bash.
  2. Detectar cópias de trabalho do git. Como você só está interessado em git, você pode executar git 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. Executar git fetch .

Aqui está uma implementação chpwd que executa git fetch ao 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 no seu script de inicialização do shell: .zshrc para zsh, .bashrc para bash (no bash você também precisa os wrappers para chamar chpwd em uma mudança de diretório ).

    
por 03.11.2016 / 00:51
0

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.

Existem algumas coisas que estão acontecendo aqui:

  1. Primeiro, usamos function cd() { para substituir o comportamento cd incorporado por nosso código personalizado.
  2. Obviamente ainda queremos mudar o diretório, então fazemos isso primeiro - prefixamos com builtin * para que o shell use o cd embutido em vez de chamar recursivamente nossa função cd() personalizada e fornecemos com $@ como os argumentos, que são expandidos pelo shell para todos os argumentos fornecidos para a função.
  3. Nós testamos se estamos em um repositório git ^ testando se o diretório .git existe, e se ele rodar git fetch , dizendo ao shell para colocá-lo em segundo plano adicionando & .

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

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

Isso redireciona stderr para stdout e envia stdout para /dev/null .

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

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

    
por 02.11.2016 / 23:19
-1

faça uma função no seu arquivo .bashrc ou .zshrc que está no seu diretório pessoal.

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 ~/.zshrc e agora você pode alterar o diretório com o comando cdg que acabou de ser alias.

Além disso, se você não quiser usar cdg e quiser usar apenas cd , altere a definição do alias para alias cd=cd_fetch .

Essa abordagem ainda produzirá tudo que a busca do git normalmente faz, para silenciá-la, substitua a linha git fetch & por git fetch 2>&1 >/dev/null & .

    
por 02.11.2016 / 23:21