Как назначить Git SHA1 в файл без Git? - PullRequest
138 голосов
/ 16 февраля 2009

Как я понимаю, когда Git назначает хэш SHA1 файлу, этот SHA1 уникален для файла на основании его содержимого.

В результате, если файл перемещается из одного хранилища в другое, SHA1 для файла остается тем же, поскольку его содержимое не изменилось.

Как Git вычисляет дайджест SHA1? Это делает это на полном несжатом содержании файла?

Я бы хотел эмулировать назначение SHA1 вне Git.

Ответы [ 12 ]

0 голосов
/ 28 июня 2018

в JavaScript

const crypto = require('crypto')
const bytes = require('utf8-bytes')

function sha1(data) {
    const shasum = crypto.createHash('sha1')
    shasum.update(data)
    return shasum.digest('hex')
}

function shaGit(data) {
    const total_bytes = bytes(data).length
    return sha1(`blob ${total_bytes}\0${data}`)
}
0 голосов
/ 12 октября 2013

Интересно отметить, что, очевидно, Git добавляет символ новой строки в конец данных перед их хэшированием. Файл, содержащий ничего, кроме «Hello World!» получает хэш BLOB-объекта 980a0d5 ..., который такой же, как этот:

$ php -r 'echo sha1("blob 13" . chr(0) . "Hello World!\n") , PHP_EOL;'
...