Как вручную создать объект Git blob и затем прочитать содержимое, используя node.js, как в главе Pro Git по Git внутренним элементам? - PullRequest
0 голосов
/ 01 марта 2020

Я прочитал главу под названием "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

Я не уверен, что я делаю здесь неправильно.

1 Ответ

1 голос
/ 07 марта 2020

Не используйте base64.

Замените zlibCompress = buffer.toString("base64); на zlibCompress = buffer;

git cat-file, это прекрасно прочитается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...