Я бы хотел улучшить ответ @ Fred Foo , предоставив модифицированную версию его скрипта, отличающуюся тем, что он не хранит файлы и каталоги в репозитории как побочный эффектвычисление их хешей: http://pastebin.com/BSNGqsqC
К сожалению, я не знаю ни одного способа заставить git mktree
не создавать объект дерева в хранилище, поэтому код должен генерировать двоичное представление дерева и передаватьэто git hash-object -t tree
.
Этот сценарий также основан на ответах от Каков внутренний формат объекта дерева мерзавцев?
Основная идея заключается в использовании git hash-object -- data.txt
, чтобы получить хеш файла и использовать git hash-object --stdin -t tree < TreeDescription
для каталога, где:
- TreeDescription - это конкатенация
"mode name\0hash"
mode
, равная "100644"
для файлов и "40000"
для каталогов (обратите внимание на отсутствие начального нуля в случае каталога) mode
и name
разделяются одним пробелом, name
и hash
разделены одним байтом \0
hash
- это 20-байтовое двоичное представление хэша объекта - записи отсортированы по
name
, что не является абсолютно необходимым для создания объекта дерева, но помогает определить, эквивалентны ли две директории, сравнивая иххэши - к сожалению, я не знаю, какой алгоритм сортировки следует использовать здесь (в частности: что делать в случае символов, отличных от ascii)
Также обратите внимание, что этот двоичный формат немного отличается откак объект дерева хранится в хранилище, так как в нем отсутствует заголовок "tree SIZE\0"
.
Очевидно, что вам нужно вычислить этот восходящий, начиная с самых глубоких файлов, так как вам нужно хешировать все дочерние элементы перед вычислениемхеш родителя.