node-git-remote

Provides simple API for interacting with git repositories remotely. For now
only a subset of the packfile protocol and file/ssh/git transports are
supported.

Installation

npm install git-remote

Usage

Consider that we are working from the same context as shown in git-core usage

connect =require('git-remote');

// first step is to connect to some remote:

remote =connect('/local/repo.git');

// or

remote =connect('git://somehost/remote/repo.git');

// or

remote =connect('user@host:remote/repo.git',{

key:fs.readFileSync('/path/to/ssh/private/key')

});

// fetch data

fetch =remote.fetch();

fetch.on('discover',function(refs){

console.log('Remote refs': refs);

// retrieve all history of master and topic branch

refs['heads/master'].want();

refs['heads/topic'].want();

fetch.flush();

});

fetch.on('progress',function(progressStatus){

console.log(progressStatus);

});

fetch.on('fetched',function(fetched){

console.log('Master branch latest commit:', fetched['heads/master']);

console.log('Topic branch latest commit:', fetched['heads/topic']);

});

// It is possible to set the maximum history depth. For example, if all you

// need is the tree pointed by a tag or branch:

fetch =remote.fetch();

fetch.maxDepth=1;

fetch.on('discover',function(refs){

refs['heads/master'].want();

fetch.flush();

});

fetch.on('fetched',function(fetched){

console.log(fetched['heads/master'].tree);

// the 'parents' properties of the commit only contains sha1 strings

};

// modify a remote repo

push =remote.push();

push.on('discover',function(refs){

// update the master branch with the c3 and parents

refs['heads/master'].update(c3);

// delete a tag

refs['tags/v0.0.1'].del();

// create a new branch referencing 'c2'

push.create('heads/new-branch', c2);

// flush the commands

push.flush();

});

push.on('pushed',function(status){

console.log(status);

});

Limitations

For now, both the git-core/git-remote packages work completely on memory, so
don't use this package to retrieve a large amount of objects. If you have
enough memory, you can see what I mean by opening node REPL and pasting
this:

connect =require('git-remote');

remote =connect('git://github.com/torvalds/linux.git');

fetch =remote.fetch();

// never forget maxDepth fetching from big repositories!

fetch.maxDepth=1;

fetch.on('discover',function(refs){

refs['tags/v2.6.11-tree'].want();

fetch.flush();

});

fetch.on('progress',function(p){

console.log(p);

});

fetch.on('fetched',function(fetched){

console.log('Fetched the initial linux import into git. Here is the tag message:');

console.log(fetched['tags/v2.6.11-tree'].message);

});

Inspect the process using 'top' or some other tool. The memory usage should
go past 400mb.