Запись файла в пустой репозиторий не в корне с помощью NodeGit / LibGit2

Я смог записать файл в ветку в пустом хранилище, используя приведенный ниже код, но он работает только для файлов в корне. Я не смог найти хорошего примера в документации о том, как построить дерево для подпапки и использовать его в качестве коммита.

async function writeFile(filename, buffer) {
  const signature = NodeGit.Signature.now('Jamie', 'jamie@diffblue.com');
  const repo = await NodeGit.Repository.openBare('java-demo.git');
  const commit = await repo.getBranchCommit('master');
  const rootTree = await commit.getTree();
  const builder = await NodeGit.Treebuilder.create(repo, rootTree);
  const oid = await NodeGit.Blob.createFromBuffer(repo, buffer, buffer.length);
  await builder.insert(filename, oid, NodeGit.TreeEntry.FILEMODE.BLOB);
  const finalOid = await builder.write();
  await repo.createCommit('refs/heads/master', signature, signature, 'Commit message', finalOid, [commit]);
}

const buffer = new Buffer('Hello\n', 'utf-8');
writeFile('test.txt', buffer).then(() => console.log('Done'));

Какие изменения необходимо будет опубликовать (например) в src / test.txt, а не в test.txt?

1 ответ

Типичный рабочий процесс для написания деревьев проходит через индекс. Например, git_index_add_frombuffer с последующим git_index_write_tree, Даже если вы не хотите выполнять запись в индекс репозитория на диске, вы все равно можете использовать интерфейс индекса, создав индекс в памяти.

В пустом хранилище без индекса вы можете использовать git_index_new с последующим git_index_read_tree чтобы получить индекс, инициализированный к содержанию вашего дерева. Затем запишите дерево в хранилище с помощью git_index_write_tree_to,

Я менее знаком с интерфейсом treebuilder, но, похоже, вам придется рекурсивно создавать новые поддеревья. Например, получить или создать src поддерево и вставить test.txt капать в него Затем получите или создайте корневое дерево и вставьте src поддерево в это.

Другие вопросы по тегам