# git-fetch-pack

> git's smart fetch-pack protocol

Latest version **0.1.1** (published 2014-05-14) · MIT license · 0 weekly downloads

## Install

```sh
npm install git-fetch-pack
pnpm add git-fetch-pack
yarn add git-fetch-pack
bun add git-fetch-pack
```

## Health

**Score 15/100 (F)** — status: abandoned.

Positive: no vulnerabilities.

Warnings: low downloads; no types; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.1.1 |
| Published | 2014-05-14 |
| First published | 2013-03-24 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | none |
| Module format | CommonJS |
| Dependencies | 4 |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 7 |
| Author | Chris Dickinson |
| Maintainers | chrisdickinson |
| Keywords | git, smart, clone, fetch, protocol |

## Links

- npm: https://www.npmjs.com/package/git-fetch-pack
- Repository: https://github.com/chrisdickinson/git-fetch-pack
- Issues: https://github.com/chrisdickinson/git-fetch-pack/issues
- npm.io page: https://npm.io/package/git-fetch-pack

## Dependencies (4)

- [bops](https://npm.io/package/bops.md) 0.0.3
- [through](https://npm.io/package/through.md) ~2.2.7
- [emit-function](https://npm.io/package/emit-function.md) 0.0.2
- [git-packed-ref-parse](https://npm.io/package/git-packed-ref-parse.md) 0.0.0

## Alternatives

- [gamedig](https://npm.io/package/gamedig.md) — 29.3K weekly downloads
- [join-monster](https://npm.io/package/join-monster.md) — 12.8K weekly downloads
- [masked](https://npm.io/package/masked.md) — 5.5K weekly downloads
- [@comunica/actor-query-process-explain-logical](https://npm.io/package/@comunica/actor-query-process-explain-logical.md) — 4.7K weekly downloads
- [@veracity/vui](https://npm.io/package/@veracity/vui.md) — 4.6K weekly downloads

## Recent versions

- 0.1.1 (latest) — 2014-05-14
- 0.1.0 — 2014-05-14
- 0.0.3 — 2013-05-06
- 0.0.2 — 2013-05-04
- 0.0.1 — 2013-03-24

## README

# git-fetch-pack

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.

```javascript
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 = refs.map(function(x) { return x.hash })
    , tcp = net.connect({host: 'github.com', 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(ref.name === 'refs/heads/master') {
      return ready(true)
    }
    return ready(false)
  }
  client = gitclient(
      'git://github.com/chrisdickinson/plate.git'
    , 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.
  client
    .pipe(transport(tcp))
    .pipe(client)

  // when we get packfile data, it'll come out of this
  // readable stream.
  client.pack.pipe(fs.createWriteStream('client-output'))
})
```

## API

#### 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](http://npm.im/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

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

#### `want_function`

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

#### stream.pack

A readable stream of packfile data.

#### stream.refs

A readable stream of remote references.

## License

MIT

---
_Source: https://npm.io/package/git-fetch-pack · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
