Local promise-returning git command wrappers

ggit v1.2.1

Local promise-returning git command wrappers

You can install and run this tool as a stand alone CLI application.

npm install -g ggit
ggit --help
# get last commit id in the current folder, save into json file
ggit last -f build.json
var clone = require('ggit').cloneRepo;
    url: '',
    folder: 'folder to create, should not exist yet'
}).then(function () {
    console.log('cloned repo to destination folder');
var exec = require('ggit').exec;
var cmd = 'rm -rf folder';
var verbose = true;
exec(cmd, verbose).then(function () {
    console.log('removed folder');

Finds last person who has touched specific line in a file

  • filename - full or partial filename (from the repo's root)
  • lineNumber - starts with 1
var blame = require('ggit').blame;
blame(filename, lineNumber).then(function (info) {
    info is object with fields like
    { commit: '6e65f8ec5ed63cac92ed130b1246d9c23223c04e',
      author: 'Gleb Bahmutov',
      committer: 'Gleb Bahmutov',
      summary: 'adding blame feature',
      filename: 'test/blame.js',
      line: 'var blame = require(\'../index\').blame;' }

Equivalent to porcelain git output: see git-blame

Returns true if given path is tracked in the repo.

  • path
var isTracked = require('ggit').isTracked;
isTracked(filename).then(function (result) {
    // result is true or false 

Returns true if there are local uncommitted stages

var changed = require('ggit').hasChanges;
changed().then(function (result) {
    // result is true or false 

Commit any changes with a given message. Second argument is optional and will be added after a blank line to the short main message.

var commit = require('ggit').commit;
commit('added foo', 'long text').then(function () {
    // after commit 

You can pass the entire message if wanted as first argument

var fullMessage = 'first line\n\nbody of message\n';

Push commits to the remote

var psuh = require('ggit').psuh;
psuh().then(function () {
    // after the push 

Returns list of commits in the given folder as a list or object

// commits.all - gets all commits 
var commits = require('ggit').commits;
// commits.byId - transforms list of commits into object 
// where keys = ids, values = messages 
// For example to get an object with 2 commit ids as keys 

Returns all tracked source files in the given folder matching pattern. Both folder and pattern are optional.

    .trackedFiles(__dirname, '*.js')
    .then(function (list) {
        console.log('javascript tracked in the current folder are');

Returns an object where for each key (filename) there is a list of commits for each line.

  • list of filenames
var perLine = require('ggit').commitPerLine;
perLine(['foo.js', 'bar.js']).then(function (result) {
        'foo.js': [{
            commit: '3c6b01eb3c96db1cbdf277904545107ef97cbb56',
            author: 'Gleb Bahmutov',
            committer: 'Gleb Bahmutov',
            summary: 'cool commit',
            filename: 'foo.js',
            line: '// actual source line' 
        'bar.js': [...]

Returns info for a specific commit - number of lines changed, deleted. Same as $ git show --numstat <id>.

    .then(function (result) {
        /* result is
                commit: <full commit SHA>,
                changes: {
                    'filename 1': {
                        filename: 'filename 1',
                        added: 10,
                        deleted: 3

Returns last commit id

    .then(function (str) {
        // str is full SHA id string 

You can pass options object as in lastCommitId(options) where

  • file - save id into the JSON file with the given file name.

Resolves with the current branch name

    .then(function (name) {
        // name = "master" or whatever 

Returns list of modified files

var changedFiles = require('ggit').changedFiles;
    .then(function (files) {})
    .catch(function (error) {});

The object files groups filenames by modification property

    A: [...], // list of added files 
    C: [...], // list of copied files 
    M: [...], // list of modified files 
    D: [...]  // list of deleted files 
// each item in the list is 
    diff: 'A' // or C, M, D 
    name: 'src/something.js' // relative to the repo root 
    filename: 'full path',
    before: 'file contents', // if available (for example M, D) 
    after: 'file contents' // if available (for A, M) 

This is a wrapper around command git diff --name-status --diff-filter=ACMD.

Returns the contents of a file at some point

  • filename - full or partial filename (from the repo's root)
  • at (optional) - checkpoint, HEAD by default
var fileContents = require('ggit').fileContents;
fileContents(filename).then(function (text) { ... });

Same as git show <at>:<name>

Edit source, run unit tests, run end to end tests and release new version commands:

npm test
grunt release
npm publish

Author: Gleb Bahmutov © 2015

License: MIT - do anything with the code, but don't blame uTest if it does not work.

Spread the word: tweet, star on github, etc.

Support: if you find any problems with this module, email / tweet / open issue on Github