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?

  • git: checkout work-tree branch from outside
  • Adding new files to git via IntelliJ
  • git submodule update and authentication
  • How are you structuring your Git repository workflow?
  • Need to safely remove corrupted file from GitLab
  • Jenkins pipeline - file not found
  • How do I add files from another directory with git?
  • Never-ending GIT story - what am I doing wrong here?
  • push heroku to github
  • osm2pgrouting import not completed using postgresql-9.4-pgrouting in Debian
  • Set up a homebrew tap with a git repository on a private network
  • Is it possible to pre-evaluate a value in bash's PS1?
  • 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.