
Como posso garantir que, ao clonar, sincronizar e obter conteúdo de outro repositório git anexo, configurei um espelho idêntico?
Eu usei uma ferramenta como o unison no passado, que fazia uma comparação de arquivo para arquivo, mas isso consome muito tempo e memória.
Existem outras alternativas para que eu possa realizar uma verificação de sanidade? A principal motivação para isso é que acabei de fazer um clone de um repositório existente, que é menor. Espero que seja menor porque o repositório antigo possui objetos não utilizados ou não referenciados, mas é um pouco diferente em tamanho.
Então, eu gostaria de ter uma verificação que possa executar.
Responder1
O Git possui uma verificação de integridade integrada ( git fsck
) que aponta problemas genéricos com a estrutura de metadados do git. Há também um coletor de lixo ( git gc
) que remove itens pendentes e outras coisas supérfluas.
Quanto à integridade dos dados... basicamente esta é uma garantia fornecida pelo git, os dados que você insere são os dados que você retira. Se o git log
(ou mesmo apenas o hash do último commit) for idêntico, os dados também serão. Cada etapa no git é somada em relação aos dados, metadados e anteriores; é como um blockchain, se os dados mudassem em algum lugar, as somas de verificação também mudariam. Se as somas de verificação não correspondessem, o git reclamaria muito na finalização da compra.
Há uma conversa antiga (2007-2008?) De Linus Torvalds sobre git que você pode assistir no Youtube, onde IIRC ele também fala sobre o lado da integridade dos dados. Há também alguma documentação aqui:https://git-scm.com/book/en/Git-Internals-Git-Objects
Na prática, as pessoas simplesmente não se preocupam com isso, já que o git cuida disso magicamente. Você apenas faz 'git status' para ver se precisa puxar/enviar/confirmar alterações para acompanhar a origem.
O uso adicional de espaço também pode ter outros motivos... git stash
pode consumir muito espaço, se você já o usou.
É aqui também que você tem diferenças nos repositórios clonados: o git não se importa com o material local que nunca foi confirmado. Se não for confirmado, não existe no que diz respeito aos clones.
Responder2
Verifiquei que o anexo git funciona conforme o esperado, fazendo o seguinte:
- obter uma listagem de arquivos exclusiva e classificada, incluindo o conteúdo .git (isso garante que tenhamos todo o conteúdo do anexo git)
- obter uma listagem de links exclusiva e classificada, incluindo conteúdo .git (isso garante que tenhamos a mesma estrutura de repositório)
- compare listagens de arquivos, ignore o diretório de anexo/transferência, os objetos git podem ser diferentes, o conteúdo do anexo git deve ser idêntico
- comparar listagens de links, devem ser idênticas
- execute um anexo git fsck ou compare a soma de verificação de todos os arquivos (este é um problema do sistema de arquivos)
Isso funciona, mas pode exigir um pouco de trabalho/tempo. Além disso, o processo pode ser ainda mais complicado por ter espelhos que são apenas cópias parciais. Para esses espelhos, você precisa apenas comparar o conteúdo que espera ter.