Подтвердить что ты не робот

Nodegit get diff всех поэтапных файлов

NodeGit предлагает простой способ получить разницу всех текущих изменений без поэтапных изменений:

import NodeGit, { Diff } from 'nodegit';

function getUnstagedChanges(path) {
  const repo = await NodeGit.Repository.open(path);
  const diff = await Diff.indexToWorkdir(repo, null, {
    flags: Diff.OPTION.INCLUDE_UNTRACKED |
           Diff.OPTION.RECURSE_UNTRACKED_DIRS
    });
  console.log(await diff.patches());
}

getUnstagedChanges();

Есть ли аналогичное решение для получения разницы всех ступенчатых изменений?

4b9b3361

Ответ 1

Хорошо, я нашел способ - однако это не сработает до того, как была сделана первая фиксация:

import NodeGit, { Diff } from 'nodegit';

function getStagedChanges(path) {
  const repo = await NodeGit.Repository.open(path);
  const head = await repository.getHeadCommit();
  if (!head) {
    return [];
  }
  const diff = await Diff.treeToIndex(repo, await head.getTree(), null);
  const patches = await diff.patches();
  console.log(patches.map((patch) => patch.newFile().path()));
}

getStagedChanges();

Ответ 2

Странно, что вы не видите поэтапных изменений, потому что indexToWorkdir работает точно так же, как git diff и показывает только поэтапные изменения. Я написал пример, который работает для меня. Он показывает как поэтапные, так и неустановленные файлы в diff, пожалуйста, попробуйте. Если параметры пропуска пропускаются, отображаются только поэтапные файлы.

Также позаботьтесь о замене Diff.OPTION.INCLUDE_UNTRACKED на Diff.OPTION.SHOW_UNTRACKED_CONTENT

import path from 'path';
import Git from 'nodegit';

async function print() {
    const repo = await Git.Repository.open(path.resolve(__dirname, '.git'));
    const diff = await Git.Diff.indexToWorkdir(repo, null, {
        flags: Git.Diff.OPTION.SHOW_UNTRACKED_CONTENT | Git.Diff.OPTION.RECURSE_UNTRACKED_DIRS
    });

    // you can't simple log diff here, it logs as empty object
    // console.log(diff); // -> {}

    diff.patches().then((patches) => {
        patches.forEach((patch) => {
            patch.hunks().then((hunks) => {
                hunks.forEach((hunk) => {
                    hunk.lines().then((lines) => {
                        console.log("diff", patch.oldFile().path(), patch.newFile().path());
                        console.log(hunk.header().trim());
                        lines.forEach((line) => {
                            console.log(String.fromCharCode(line.origin()) + line.content().trim());
                        });
                    });
                });
            });
        });
    });

    return diff;
}

print().catch(err => console.error(err));