2016-03-27 8 views
13

NodeGit bietet eine einfache Möglichkeit, ein diff aller aktuellen Änderungen ohne die inszenierten Änderungen zu erhalten:nodegit zu bekommen diff aller Dateien inszenierten

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

Gibt es eine ähnliche Lösung ein diff aller inszenierten Änderungen zu bekommen?

Antwort

4

Okay, ich einen Weg gefunden - aber es ist nicht vor dem ersten gemacht wurde funktionieren commit:

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

Das ist seltsam, dass Sie keine abgestuften Änderungen sehen, weil indexToWorkdir genau wie git diff funktioniert und nur gestufte Änderungen zeigt. Ich habe ein Beispiel geschrieben, das funktioniert für mich. Es zeigt sowohl inszenierte als auch nicht gesicherte Dateien in diff, bitte probiere es aus. Bei Überspringen von Optionen wurden nur gestaffelte Dateien angezeigt.

sorgen auch nach dem Ersatz der Diff.OPTION.INCLUDE_UNTRACKED zu 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)); 
+0

indexToWorkdir entspricht den workdir gegen die Aktueller Index (gestaffelt), so dass nur die nicht gespeicherten Dateien angezeigt werden. – jantimon

+0

versuchte es ohne irgendwelche Commit im Repository, es funktioniert. –

+0

Ich versuche, den oberen Teil (gestaffelte Dateien) zu reproduzieren: http://blog.sourcetreeapp.com/files/2014/08/Screen-Shot-2014-08-19-at-2.02.03-PM.png – jantimon