138 votes

Attribution de Git SHA1 ' s sans Git

<p>Si je comprends bien quand Git assigne un hachage SHA1 d’un fichier ce SHA1 est unique dans le fichier basé sur son contenu.</p> <p>Ainsi si un fichier est déplacé d’un référentiel à l’autre le SHA1 du fichier reste la même que son contenu n’ont pas changé.</p> <p>Comment Git calcule-t-il le digest SHA1 ? Il le faire sur le contenu du fichier non compressé complet ?</p> <p>Je tiens à émuler assignant SHA1 à l’extérieur de la Git.</p>

250voto

Ferdinand Beyer Points 27723

C'est de cette façon Git calcule le SHA1 d'un fichier (ou, dans Git termes, un "blob"):

sha1("blob " + filesize + "\0" + data)

Donc, vous pouvez facilement calculer vous-même sans avoir Git installé. Notez que le "\0" est la valeur NULL byte, pas une chaîne de deux caractères.

Par exemple, le hash d'un fichier vide:

sha1("blob 0\0") = "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"

$ touch empty
$ git hash-object empty
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391

Un autre exemple:

sha1("blob 7\0foobar\n") = "323fae03f4606ea9991df8befbb2fca795e648fa"

$ echo "foobar" > foo.txt
$ git hash-object foo.txt 
323fae03f4606ea9991df8befbb2fca795e648fa

Voici un Python de mise en œuvre:

from hashlib import sha1
def githash(data):
    s = sha1()
    s.update("blob %u\0" % len(data))
    s.update(data)
    return s.hexdigest()

17voto

knittl Points 64110
<p>Un peu goodie : en coquille<pre class="lang-sh prettyprint-override"><code></code></pre></p>

8voto

Charles Bailey Points 244082
<p>Vous pouvez faire une fonction du shell bash de la calculer assez facilement si vous n’avez pas installé de git.<pre class="lang-sh prettyprint-override"><code></code></pre></p>

4voto

Dale Hagglund Points 7159
<p>Jetez un oeil à la page de manuel pour <a href="http://www.kernel.org/pub/software/scm/git/docs/git-hash-object.html" rel="nofollow"><em>git-hash-objet</em></a>. Vous pouvez l’utiliser pour calculer le hachage git de n’importe quel fichier en particulier. Je <em>pense</em> que git nourrit plus que juste le contenu du fichier dans l’algorithme de hachage, mais je ne sais pas pour vous, et si elle se nourrit dans des données supplémentaires, je ne sais pas ce que c’est.</p>

2voto

forki23 Points 1225
<pre class="lang-ml prettyprint-override"><code></code><p>Il s’agit d’une solution en F #.</p></pre>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: