github, SHA-1 hash y git duplicates

Tengo un repository github que parece tener commits duplicates. Cada confirmación tiene la misma cadena de post y la misma date / autor, pero diferentes sums de hash SHA-1. Por ejemplo, en mi logging encontré el siguiente cuádruple:

'commit 55e55517bf32b7ba7382b97f41a1514af8a5f5dc', 'Author: dermen <dermen@stanford.edu>', 'Date: Tue Feb 19 20:03:35 2013 -0800', 'finished with the cromermann edition', 'commit 814fb08e0d42588a500947cba42a980ac24c01b8', 'Author: dermen <dermen@stanford.edu>', 'Date: Tue Feb 19 20:03:35 2013 -0800', 'finished with the cromermann edition', 'commit a5f581f513d12e95627669f61cfe27064ffe8319', 'Author: dermen <dermen@stanford.edu>', 'Date: Tue Feb 19 20:03:35 2013 -0800', 'finished with the cromermann edition', 'commit a264614b674e1ad2c4c8cc953cb27cf77c0d2615', 'Author: dermen <dermen@stanford.edu>', 'Date: Tue Feb 19 20:03:35 2013 -0800', 'finished with the cromermann edition', 

Todo es idéntico excepto por el hash SHA-1. Cuando corro, por ejemplo

 git diff 55e55517bf32b7ba7382b97f41a1514af8a5f5dc 814fb08e0d42588a500947cba42a980ac24c01b8 

Obtengo salida cero – ¿esto no significa que los commits son idénticos? Si esto es cierto, ¿por qué tendrían sums de hash SHA-1 separadas? Quizás comprendo mal, ¿pero un hash SHA-1 no debería representar directamente el contenido de un file? Por lo tanto, si los commits son iguales, entonces deberían tener el mismo hash.

En cualquier caso, me pregunto si es sabio / imprudente intentar filtrar dichos duplicates aparentes … Cualquier consejo / networkingirección será apreciado.

Solutions Collecting From Web of "github, SHA-1 hash y git duplicates"

Un git commit sha se genera a partir de la siguiente información

  • post de compromiso
  • firma del autor (identidad + timestamp)
  • firma committer (identidad + timestamp)
  • tree sha (jerarquía de directorys y files dentro del commit)
  • list de los shas de los padres se compromete

Como los shas son diferentes, esto se debe a que al less una de estas informaciones difiere.

Con el fin de get una mejor comprensión de cuáles son esos datos para cada compromiso (y cómo difieren uno de otro), puede ejecutar el siguiente command para get el resultado bruto de cada confirmación

 $ git show --format=raw <commit_sha> 

Ejemplo de la salida de este command

Basado en un compromiso aleatorio del proyecto libgit2

 $ git show --format=raw eb58e2d commit eb58e2d0be4e07c2ef873a5f0562eaa90826c2de tree 41959050b1e3adb428e140102a0c321949be516b parent 3b5001b4c911db9c47d62399c1adc03bd8a3ca72 parent 3e9e6cdaff8acb11399736abbf793bf2d000d037 author Vicent Marti <tanoku@gmail.com> 1371063948 +0200 committer Vicent Marti <tanoku@gmail.com> 1371063948 +0200 Merge remote-tracking branch 'arrbee/minor-paranoia' into development diff --cc src/refdb.c index 359842e,4271b58..6da409a --- a/src/refdb.c +++ b/src/refdb.c @@@ -86,9 -86,10 +86,10 @@@ int git_refdb_compress(git_refdb *db return 0; } -static void refdb_free(git_refdb *db) +void git_refdb__free(git_refdb *db) { refdb_free_backend(db); + git__memset(db, 0, sizeof(*db)); git__free(db); } 

De vuelta a tus preguntas

Obtengo salida cero – ¿esto no significa que los commits son idénticos?

Esto significa que el contenido de lo que apuntan los commits es el mismo. Pero los metadatos ciertamente pueden diferir.

Quizás comprendo mal, ¿pero un hash SHA-1 no debería representar directamente el contenido de un file?

En Git, los hashes SHA-1 se usan para representar objects git: blobs (es decir, files), treees (es decir, list de blobs y subtreees) y commits . Puede encontrar más información sobre esto en el capítulo 9.2 Git Internals – Objetos Git del libro Pro Git .

Por ejemplo, en mi logging encontré el siguiente cuádruple

Esto puede suceder cuando modifica / rebase / corrige el contenido de sus confirmaciones, por ejemplo. En estos casos, solo la date de compromiso cambiaría.

En cualquier caso, me pregunto si es sabio / imprudente intentar filtrar dichos duplicates aparentes.

No tienes que limpiar tú solo. Esos objects se almacenan en la database de objects Git. Git implementa un mecanismo de recolección de basura que eliminará regularmente y automáticamente los objects huérfanos (ver la documentation de git-gc para más detalles).