node package manager
Stop writing boring code. Discover, share, and reuse within your team. Create a free org »



git's smart fetch pack protocol (the one that calls upload-pack on the server).

can be used to download packfiles (fetch or clone!) or to list remote branches.

var net = require('net')
  , fs = require('fs')
var gitclient = require('git-fetch-pack')()
  , transport = require('git-transport-protocol')
  , load = require('git-fs-repo')
  , walk = require('git-walk-refs')
load('/path/to/repo/.git', function(err, git) {
  var refs = git.refs()
    , hashes = { return x.hash })
    , tcp = net.connect({host: '', port: 9418})
    , client
  // given a want(ref, ready) function and a stream 
  // of all of the commits the repo has in reverse 
  // chronological order, we can negotiate a sweet 
  // packfile from the remote! 
  function want(ref, ready) {
    if( === 'refs/heads/master') {
      return ready(true)
    return ready(false)
  client = gitclient(
    , want
    , walk(git.find, hashes)
  // output ref data from the remote server! `refs` 
  // is a readable stream.  
  client.refs.on('data', console.log)
  // pipe client to the transport and back to client. 
  // when we get packfile data, it'll come out of this 
  // readable stream. 


client(hostinfo[, want_function][, have_stream][, capabilities]) -> client duplex stream

create a client for communicating with hostinfo that uses want_function to determine which branches to ask for, and can provide a list of already-present commits using have_stream.

by providing the want_function argument (which takes a ref object and a ready callback) but no others, you may emulate a git clone.

by additionally providing a have_stream (usually using git-walk-refs), you can emulate a git fetch.

by providing capabilities, you enable the ability to blow your foot off, mostly; since by default this module does not support either side-band protocol.

Ref objects

{ "hash": "git hash"
, "name": "refs/heads/master" // for example 
, "commit": null | "hash" }   // for annotated tags 


function want(ref, ready) {
  // do you want this ref object? 
  ready(true) // sure do 
  ready() || ready(false) || ready('') // sure don't. 


A readable stream of packfile data.


A readable stream of remote references.