nodegit获取所有staged文件的diff

时间:2016-03-27 08:45:43

标签: javascript node.js git

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();

是否有类似的解决方案来获得所有阶段性变化的差异?

3 个答案:

答案 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');