Verificar la integridad de Git

Pronto sourceforge restaurará mi repository git de proyectos.

Tengo un 'tirón' desde el día antes de que desapareciera; así que estoy seguro de que no tengo pérdida de datos en mi copy local.

¿Me gustaría hacer una "comparación profunda" de mi copy local con el repository principal de forge sourceforge que se va a restaurar para asegurarme de que estamos absolutamente sincronizados antes de confirmar cualquier cambio nuevo? Prueba que las historias coinciden; los mismos objects con los mismos hashes; y cualquier otra cosa que pueda prevenir el dolor futuro.

Algo así como (un inexistente) "git compare-trees –verify …."

Supongo que podría ser más fácil renombrar el repository sourceforge, y luego empujar mi copy local como el nuevo maestro, pero eso me parece poco elegante.

Como otros mencionaron en los comentarios, solo necesitas verificar los valores SHA-1 (y ejecutar git fsck para hacer que compare el nombre SHA-1 por el cual se encuentra cada object, con el SHA-1 actual de cada object 1 ).

Dado que git usa una forma de Merkle Tree , si el SHA-1 para una twig como master en un repository coincide con el SHA-1 para una twig en otro repository, puedes estar razonablemente seguro de que toda la cadena de confirmaciones es un poco -bit idéntico en ambos repositorys. Por lo tanto, comparar el resultado de una simple ejecución de git for-each-ref en cada repository hará el truco.


1 Si estos no coinciden internamente, verá (de la documentation de git-fsck ):

  sha1 mismatch <object> The database has an object who's sha1 doesn't match the database value. This indicates a serious data integrity problem. 

2 La posibilidad de una coincidencia accidental entre dos SHA-1 para diferentes inputs es una en 2 160 (2 160 es un poco más de 10 48 , por lo que este es uno en 1.465 quindecillones ). A medida que aumenta el número de objects, la posibilidad aumenta rápidamente debido al "problema del cumpleaños", pero para fines prácticos, es bastante raro ignorarlo por completo. La única forma de conseguir una colisión real es hacerlo a propósito, y eso es demasiado difícil .