Eu queria saber hoje como o git garante a integridade de seus metadados e estou um pouco surpreso com o que encontrei. Eu usei a seguinte configuração simples para testar:
- Dois repositórios de trabalho, chamados
x
ey
- Um repositório nu, chamado
xy.git
Então, inicialmente x
e y
estão empurrando para e puxando de x.git
e tudo funciona bem. Agora, digamos que um dos objetos de metadados ( .git/objects/...
) em x.git
torna-se corrompido por qualquer motivo (escolha o seu incidente aleatório favorito).
Eu estava realmente assumindo que algo vai quebrar no próximo push ou pull, mas para minha surpresa, tudo parecia funcionar bem. Mais se compromete, mais empurrando e puxando, sem problemas. A primeira vez que algo foi relatado como corrompido foi quando tentei clonar outro repositório de trabalho do repositório vazio, deixando meu clone em um estado inutilizável.
Agora eu pensei que não é tão ruim assim, porque graças à arquitetura do git, eu posso simplesmente despejar o repositório vazio no pior dos casos, e recriá-lo com todo o histórico de um dos meus conjuntos de trabalho. Mas não. Sem aviso prévio, o arquivo corrompido passou pelos repositórios de trabalho, impossibilitando a clonagem de um novo repositório descoberto deles também.
Isso acontece não apenas quando eu começo com um arquivo corrompido no repositório nu, mas também é possível introduzir um arquivo corrompido de um repositório de trabalho em um repositório simples dessa forma.
Claro, pode-se consertar isso por outros meios, mas ainda estou surpreso (e um pouco preocupado) com a facilidade que parece ser bagunçar o repositório para todos que trabalham com ele. Especialmente desde que o erro pode permanecer despercebido até a próxima vez que alguém tentar clonar. Não deveria haver verificações contra isso, em algum lugar, de alguma forma?
Alguém aqui disposto a tentar se é reproduzível? Eu experimentei com a versão 2.7.4 do git.
Qualquer conselho sobre como verificar essa corrupção é muito bem-vindo.