Я прочитал главу под названием "Git Internals - Git Objects" в Pro Git book .
В заключительной части, озаглавленной "Хранение объектов", показано Вы можете вручную создать объект BLOB-объекта Git, а затем прочитать содержимое этого объекта. Это показано с помощью Ruby.
Я пытался сделать то же самое в узле.
Сначала я создал каталог с именем my-git-tests
, и в нем я запустил git init
. Я создал один javascript файл с именем s.js
, аналогичный командам в главе с Ruby, и вот он:
const crypto = require('crypto');
const path = require('path');
const fs = require('fs');
const zlib = require('zlib');
const content = 'what is up, doc?';
const header = `blob ${Buffer.from(content).length}\0`;
console.log('Header', header.length, header);
const store = header + content;
console.log('Store is ', store);
const hash = crypto.createHash('sha1');
const sha1 = hash.update(store, 'utf-8').digest('hex');
console.log('SHA-1 is ', sha1);
const objectPath = `.git/objects/${sha1.substr(0, 2)}/${sha1.substr(2)}`;
console.log('Path is ', objectPath);
fs.mkdirSync(path.dirname(objectPath));
let zlibCompress;
zlib.deflate(store, (err, buffer) => {
if (!err) {
zlibCompress = buffer.toString('base64');
console.log('zlib: ', zlibCompress);
fs.writeFile(objectPath, zlibCompress, function(err) {
if (err) {
console.log(err);
}
console.log('saved');
});
} else {
console.log('Error compressing.');
}
});
Когда я запускаю этот скрипт, вывод будет
Header 8 blob 16
Store is blob 16what is up, doc?
SHA-1 is bd9dbf5aae1a3862dd1526723246b20206e5fc37
Path is .git/objects/bd/9dbf5aae1a3862dd1526723246b20206e5fc37
zlib: eJwFwYEBACAEBMCV8kKNQ8/+I3RXvKyxzJbU4yDF4AHF9sLC8rZ5Gh/tqwrk
saved
Однако, когда я пытаюсь прочитать объект Git: git cat-file -p bd9dbf5aae1a3862dd1526723246b20206e5fc37
, я получаю
error: inflate: data stream error (incorrect header check)
error: unable to unpack bd9dbf5aae1a3862dd1526723246b20206e5fc37 header
fatal: Not a valid object name bd9dbf5aae1a3862dd1526723246b20206e5fc37
Я не уверен, что я делаю здесь неправильно.