XUtils

isomorphic-git

Pure JavaScript implementation of Git.


isomorphic-git

isomorphic-git is a pure JavaScript reimplementation of git that works in both Node.js and browser JavaScript environments. It can read and write to git repositories, fetch from and push to git remotes (such as GitHub), all without any native C++ module dependencies.

Goals

Isomorphic-git aims for 100% interoperability with the canonical git implementation. This means it does all its operations by modifying files in a “.git” directory just like the git you are used to. The included isogit CLI can operate on git repositories on your desktop or server.

This library aims to be a complete solution with no assembly required. The API has been designed with modern tools like Rollup and Webpack in mind. By providing functionality as individual functions, code bundlers can produce smaller bundles by including only the functions your application uses.

The project includes type definitions so you can enjoy static type-checking and intelligent code completion in editors like VS Code and CodeSandbox.

Project status

The original author of the project (Billie Hilton) left the project, but the project is still maintained by two volunteers:

But they don’t write much code, mainly do code review and try to answer to issues and on Gitter, they just don’t want the project to die. So you can say that this project is community driven (as jcubic always reply to issues). Which means that if you want a feature to be implemented you need to do this yourself or find someone that is willing to write the code for you. The project have some money on OpenCollective and we can spend it on some development, if you find somoene that is willing to code in exchange to some bucks (it may be you), but we don’t have a lot so don’t expect to have full sallary.

If you want to help this project you’re more than welcome to do so.

Upgrading from version 0.x to version 1.x?

See the full Release Notes on GitHub and the release Blog Post.

Install

You can install it from npm:

npm install --save isomorphic-git

Getting Started

The “isomorphic” in isomorphic-git means that the same code runs in either the server or the browser. That’s tricky to do since git uses the file system and makes HTTP requests. Browsers don’t have an fs module. And node and browsers have different APIs for making HTTP requests!

So rather than relying on the fs and http modules, isomorphic-git lets you bring your own file system and HTTP client.

If you’re using isomorphic-git in node, you use the native fs module and the provided node HTTP client.

// node.js example
const path = require('path')
const git = require('isomorphic-git')
const http = require('isomorphic-git/http/node')
const fs = require('fs')

const dir = path.join(process.cwd(), 'test-clone')
git.clone({ fs, http, dir, url: 'https://github.com/isomorphic-git/lightning-fs' }).then(console.log)

If you’re using isomorphic-git in the browser, you’ll need something that emulates the fs API. The easiest to setup and most performant library is LightningFS which is written and maintained by the same author and is part of the isomorphic-git suite. If LightningFS doesn’t meet your requirements, isomorphic-git should also work with BrowserFS and Filer. Instead of isomorphic-git/http/node this time import isomorphic-git/http/web:

<script src="https://unpkg.com/@isomorphic-git/lightning-fs"></script>
<script src="https://unpkg.com/isomorphic-git"></script>
<script type="module">
import http from 'https://unpkg.com/isomorphic-git@beta/http/web/index.js'
const fs = new LightningFS('fs')

const dir = '/test-clone'
git.clone({ fs, http, dir, url: 'https://github.com/isomorphic-git/lightning-fs', corsProxy: 'https://cors.isomorphic-git.org' }).then(console.log)
</script>

If you’re using ES module syntax, you can use either the default import for convenience, or named imports to benefit from tree-shaking if you are using a bundler:

import git from 'isomorphic-git'
// or
import * as git from 'isomorphic-git'
// or
import {plugins, clone, commit, push} from 'isomorphic-git'

View the full Getting Started guide on the docs website.

Then check out the Useful Snippets page, which includes even more sample code written by the community!

isogit CLI

Isomorphic-git comes with a simple CLI tool, named isogit because isomorphic-git is a lot to type. It is really just a thin shell that translates command line arguments into the equivalent JS API commands. So you should be able to run any current or future isomorphic-git commands using the CLI.

It always starts with an the assumption that the current working directory is a git root. E.g. { dir: '.' }.

It uses minimisted to parse command line options and will print out the equivalent JS command and pretty-print the output JSON.

The CLI is more of a lark for quickly testing isomorphic-git and isn’t really meant as a git CLI replacement.

commands

Community

Share your questions and ideas with us! We love that. You can find us in our Gitter chatroom or just create an issue here on Github! We are also @IsomorphicGit on Twitter.

Who is using isomorphic-git?

Similar projects

Acknowledgments

Isomorphic-git would not have been possible without the pioneering work by @creationix and @chrisdickinson. Git is a tricky binary mess, and without their examples (and their modules!) I would not have been able to come even close to finishing this. They are geniuses ahead of their time.

Cross-browser device testing is provided by:

BrowserStack

SauceLabs

Contributors

Thanks goes to these wonderful people (emoji key):


William Hilton

πŸ“ πŸ› πŸ’» 🎨 πŸ“– πŸ’‘ ⚠️ βœ…

wDhTIG

πŸ›

Marc MacLeod

πŸ€” πŸ”

Brett Zamir

πŸ€”

Dan Allen

πŸ› πŸ’» πŸ€”

TomΓ‘Ε‘ HΓΌbelbauer

πŸ› πŸ’»

Juan Campa

πŸ› πŸ’»

Ira Miller

πŸ›

Rhys Arkins

πŸ’»

Sean Larkin

πŸ’»

Daniel Ruf

πŸ’»

bokuweb

πŸ’» πŸ“– ⚠️

Hiroki Osame

πŸ’» πŸ“–

Jakub Jankiewicz

πŸ’¬ πŸ› πŸ’» πŸ’‘ ⚠️

howardgod

πŸ› πŸ’»

burningTyger

πŸ›

Melvin Carvalho

πŸ“–

akaJes
πŸ’»

Dima Sabanin

πŸ› πŸ’»

Koutaro Chikuba

πŸ› πŸ’»

Hubert SABLONNIÈRE

πŸ’» ⚠️ πŸ€” πŸ”

David Duarte

πŸ’»

Thomas Pytleski

πŸ› πŸ’»

Vadim Markovtsev

πŸ›

Yu Shimura

πŸ€” πŸ’» ⚠️

Dan Lynch

πŸ’»

Jeffrey Wescott

πŸ› πŸ’»

zebzhao

πŸ’»

Tyler Smith

πŸ›

Bram Borggreve

πŸ›

Stefan Guggisberg

πŸ› πŸ’» ⚠️

Catalin Pirvu

πŸ’»

Nicholas Nelson

πŸ’» ⚠️

Anna Henningsen

πŸ’»

Fabian Henneke

πŸ› πŸ’»

djencks

πŸ› πŸ’» ⚠️

Clemens Wolff

πŸ’» πŸ“– ⚠️

Sojin Park

πŸ’»

Edward Faulkner

πŸ’»

KhαΊ£i

πŸ›

Corbin Crutchley

πŸ’» πŸ“– ⚠️

Riceball LEE

πŸ’» πŸ“– ⚠️

lin onetwo

πŸ’»

ζž—ζ³•ι‘«

πŸ›

Will Stott

πŸ’» ⚠️

Seth Nickell

πŸ›

Alex Titarenko

πŸ’»

Misha Kaletsky

πŸ’»

Richard C. Zulch

πŸ’» πŸ“–

mkizka

πŸ’»

RyotaK

πŸ›

Noah Hummel

πŸ’» ⚠️

Mike Lewis

πŸ“–

Sam Verschueren

πŸ’»

Vitor Luiz Cavalcanti

πŸ“–

Shane McLaughlin

πŸ’» πŸ“– ⚠️

Sean Poulter

🚧

araknast

πŸ’» ⚠️ πŸ“–

Rafael Raab

πŸ’» πŸ“–

LukΓ‘Ε‘ Cezner

πŸ’» πŸ“– ⚠️ πŸ›

dead-end

πŸ’» πŸ“– ⚠️

Barry

πŸ’» πŸ“– ⚠️

Alireza Mirian

πŸ’» πŸ“– ⚠️ πŸ›

DanilKazanov

πŸ’» πŸ“– ⚠️

Eyal Hisco

πŸ›

Sebastien

πŸ’»

Yaroslav Halchenko

πŸ“–

Alex Villarreal

πŸ’»

Ben Morrow

πŸ’»

jayree

πŸ’» ⚠️

Lucas Martin Segurado

πŸ“– πŸ›

Leon Kaucher

πŸ’» ⚠️

Gili Shohat

πŸ’» πŸ“– ⚠️

This project follows the all-contributors specification. Contributions of any kind welcome!

<!–

Backers

Thank you to all our backers! πŸ™ [Become a backer]


Articles

  • coming soon...