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();
是否有类似的解决方案来获得所有阶段性变化的差异?
答案 0 :(得分:6)
好的,我找到了一种方法 - 但是在第一次提交之前它不会起作用:
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();
答案 1 :(得分:1)
奇怪的是,您没有看到分阶段的更改,因为indexToWorkdir
的工作方式与git diff
完全相同,只显示分阶段的更改。我写的例子,对我有用。它显示diff中的staged和unstated文件,请尝试一下。如果跳过选项,则仅显示暂存文件。
还要注意将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));
答案 2 :(得分:1)
通过使用空树(不包含任何内容的树的哈希),即使没有提交,这种方法也将起作用。
import { Repository, Tree, Diff } from 'nodegit';
const emptyTree = '4b825dc642cb6eb9a060e54bf8d69288fbee4904';
function getStagedChanges(path) {
const repo = await Repository.open(path);
const head = await repository.getHeadCommit();
const tree = await (head ? head.getTree() : Tree.lookup(repo, emptyTree));
const diff = await Diff.treeToIndex(repo, await head.getTree(), null);
const patches = await diff.patches();
console.log(patches.map((patch) => patch.newFile().path()));
}
getStagedChanges('/path/to/repo');