gpt4 book ai didi

javascript - 如何手动创建 Git blob 对象,然后使用 node.js 读取内容,就像 ProGit 关于 Git 内部原理的章节中一样?

转载 作者:行者123 更新时间:2023-12-02 21:36:55 26 4
gpt4 key购买 nike

我读了chapter called "Git Internals - Git Objects" in the ProGit book .

最后一部分标题为“对象存储”,向您展示如何手动创建 Git blob 对象,然后读取该对象的内容。这是使用 Ruby 显示的。

我尝试在 Node 中做同样的事情。

首先我创建了一个名为 my-git-tests 的目录,我在其中运行了 git init 。我创建了一个名为 s.js 的 JavaScript 文件类似于 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

我不确定我在这里做错了什么。

最佳答案

不要使用base64。

zlibCompress = buffer.toString("base64); 替换为 zlibCompress = buffer;

git cat-file 可以很好地读取此内容。

关于javascript - 如何手动创建 Git blob 对象,然后使用 node.js 读取内容,就像 ProGit 关于 Git 内部原理的章节中一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60471720/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com