Estou procurando a maneira mais rápida de descobrir se uma ramificação de rastreamento remoto é diferente de uma ramificação atual.
Contexto: Gostaria de executar uma tarefa cron, que deve descobrir se o HEAD atual da ramificação local é idêntico ao seu branch de rastreamento remoto. Pode haver centenas de hosts executando este cron job (cada um pode estar em uma ramificação/HEAD diferente). Então, eu gostaria de implementar isso o mais rápido e eficiente possível. (menor carga de rede possível e carga de CPU no servidor git)
No momento eu executo um git fetch
e então git status
. No entanto, mesmo que outras ramificações sejam alteradas no host remoto, git fetch
elas ficarão ocupadas por algum tempo e git status
também não serão tão eficientes.
O repositório está hospedado em um servidor gitlab (somente acesso https, os repositórios requerem autenticação)
Portanto, uma solução git pura é tão apreciada quanto uma solução gitlab.
Gostaria de implementar a solução como bash
script ou como python
script. pip install
de qualquer dependência útil não é um problema.
Na verdade, gostaria de realizar essa verificação para alguns repositórios em um host (todos acessíveis com as mesmas credenciais). Acho que, se eu puder otimizar uma verificação, serei o melhor possível e executarei essa verificação para cada repositório.
No entanto, se houver um truque para melhorar o desempenho consultando vários repositórios com um script, essa também é uma opção. (por exemplo, autenticar apenas uma vez, consultar vários repositórios)
Use
git ls-remote
para listar todas as referências remotas e seus IDs de objeto.O mesmo comando funciona em repositórios locais, mas
git rev-parse
será mais eficiente lá.A ramificação atual é definida fazendo com que HEAD seja uma referência "simbólica" para outra referência:
No entanto, se você for buscar as atualizações de qualquer maneira , é melhor ir direto para
git fetch
a referência do branch específico.A ramificação buscada sempre se torna uma referência que você pode comparar da mesma maneira:
(Os nomes de referência completos quase sempre podem ser abreviados para apenas
master:origin/master
, mas eu não colocaria isso em um script.)