Se ocorrer um push forçado ou exclusão de ramificação, o objeto antigo apontado pela referência poderá deixar de ser referenciado por qualquer referência e, portanto, ser elegível para coleta de lixo.
Durante a duração do gancho git post-receive de tal push, é garantido que o objeto antigo ainda seja válido?
Acho que o ponto levantado por @j6t está correto: não acho que haja uma garantia formal .
Dito isto: o código tenta ser explícito sobre isso.
Você pode observar a implementação da
receive-pack
ação do lado do servidor (código da v2.48.1 ):e observe que a execução do
post-receive
hook ( l.2610 ) acontece antes de uma chamada explícita para a ação "auto_gc" (bloco de código começando em l.2615 ).Portanto, se seu
post-receive
hook for síncrono, essa ação autogc não excluirá commits obsoletos antes de executar seu hook.git
também tem um mecanismo básico de bloqueio em seu banco de dados para evitar que ações simultâneas façam coisas ruins, então acho que outras ações do gc seriam rejeitadas durante a execução do seu hook (embora eu não tenha trazido evidências desse ponto nesta resposta).Não há garantia formal de que o objeto pendente permaneça válido, porque é impossível saber quando um gancho pós-recebimento (ou qualquer
git
comando) concluiu sua operação.A única provisão que existe é que a coleta de lixo dará aos objetos uma "curta vida útil" depois que eles ficarem pendurados. "Curto" aqui significa duas semanas e é configurável. A intenção é que esse intervalo de tempo seja suficiente para que qualquer
git
comando em andamento seja concluído e tenha parado de usar os objetos pendurados.