nodegit get diff of all staged files

NodeGit offers an easy way to get a diff of all current changes without the staged changes:

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

Is there a similar solution to get a diff of all staged changes?

  • Azure git deploy of node project failing
  • npm - release module multiple branches with multiple versions
  • Best workflow using node.js npm and git
  • Best way to scaffold a backend directory structure shared among different projects
  • Deploying my node.js app from Github to a VPS
  • NodeJS with MongoDB - Pushing project to Github
  • ibm bluemix node js files
  • Node.js node_modules checked into git with Linux/Unix & Windows developers?
  • 2 Solutions collect form web for “nodegit get diff of all staged files”

    Okay I found a way – however it will not work before the first commit was made:

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

    That is strange that you doesn’t see staged changes, because indexToWorkdir works exactly like git diff and show only staged changes. I wrote example, that works for me. It show both staged and unstaged files in diff, please try it. If skip options, only staged files showed.

    Also take care about replacement of Diff.OPTION.INCLUDE_UNTRACKED to 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));
    
    Git Baby is a git and github fan, let's start git clone.