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:
- Execute algum código para alterar o diretório atual. No zsh, você coloca esse código no
chpwd
função, ou uma função com um nome diferente nachpwd_functions
matriz (exemplo). VerExecute scripts bash ao entrar em um diretóriopara uma implementação bash. - Detecte cópias de trabalho do git. Como você está interessado apenas em git,você pode correr
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. - Correr
git fetch
.
Aqui está uma chpwd
implementação que é executada 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 para o seu script de inicialização do shell: .zshrc
para zsh, .bashrc
para bash (no bash você também precisaos wrappers para chamar chpwd
em 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:
- Primeiro, usamos
function cd() {
para substituir ocd
comportamento interno por nosso próprio código personalizado. - Obviamente, ainda queremos alterar o diretório, então fazemos isso primeiro - prefixamos
builtin
* para que o shell use o builtincd
em vez de chamar recursivamente nossacd()
função personalizada, e o fornecemos$@
como argumentos, que são expandidos pelo shell a todos os argumentos fornecidos à função. - Testamos se estamos em um repositório git^ testando se o
.git
diretório existe e, se existir, executamosgit fetch
, dizendo ao shell para colocá-lo em segundo plano anexando&
.
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 o stderr para o stdout e, em seguida, envia o stdout para o /dev/null
.
[*]: Observe que builtin
nã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 ~/.zshrc
e agora você pode alterar o diretório com o comando cdg
que acabou de criar o alias.
Além disso, se você não quiser usar cdg
e quiser usar, basta cd
alterar 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 &
.