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();
Есть ли аналогичное решение для получения разницы всех ступенчатых изменений?
Ответы
Ответ 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));