git-remote

API for pushing/fetching objects to/from git repositories

Usage no npm install needed!

<script type="module">
  import gitRemote from 'https://cdn.skypack.dev/git-remote';
</script>

README

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.