Skip to content

A pure JavaScript implementation of git for node and browsers!

License

Notifications You must be signed in to change notification settings

isomorphic-git/isomorphic-git

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

1,163 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Image

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 someone 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.

Supported Environments

The following environments are tested in CI and will continue to be supported until the next breaking version:

Image
Node 10
Image
Chrome 79
Image
Edge 79
Image
Firefox 72
Image
Safari 13
Image
Android 10
Image
iOS 13

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 ZenFS 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!

CORS support

Unfortunately, due to the same-origin policy by default isomorphic-git can only clone from the same origin as the webpage it is running on. This is terribly inconvenient, as it means for all practical purposes cloning and pushing repos must be done through a proxy.

For this purpose, @isomorphic-git/cors-proxy exists; which you can clone it or npm install it. Alternatively, use CloudFlare workers, which can be setup without leaving the browser (instructions).

For testing or small projects, you can also use https://cors.isomorphic-git.org - a free proxy sponsored by Clever Cloud.

We hope to get CORS headers added to all the major Git hosting platforms eventually, and will list the progress made here:

Service Supports CORS requests
Gogs (self-hosted) βœ”
Gitea (self-hosted) βœ”
Azure DevOps βœ” (Usage Note: requires authentication)
Gitlab ❌ Our PR was rejected, but the issue is still open!
Bitbucket ❌
Github ❌

It is literally just two lines of code to add the CORS headers!! Easy stuff. Surely it will happen.

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.

Supported Git commands

This project follows semantic versioning, so we may continue to make changes to the API but they will always be backwards compatible unless there is a major version bump.

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.

Contributing to isomorphic-git

The development setup is similar to that of a large web application. The main difference is the ridiculous amount of hacks involved in the tests. We use Facebook's Jest for testing, which make doing TDD fast and fun, but we also used custom hacks so that the same tests will also run in the browser using Jasmine via Karma. We even have our own mock server for serving git repository test fixtures!

You'll need node.js installed, but everything else is a devDependency.

git clone https://github.com/isomorphic-git/isomorphic-git
cd isomorphic-git
npm install
npm test

The new release happens automatically after every PR merge. We use semantic release.

Check out the CONTRIBUTING document for more instructions.

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!) we 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):

Image
William Hilton

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

πŸ›
Image
Marc MacLeod

πŸ€” πŸ”
Image
Brett Zamir

πŸ€”
Image
Dan Allen

πŸ› πŸ’» πŸ€”
Image
TomΓ‘Ε‘ HΓΌbelbauer

πŸ› πŸ’»
Image
Juan Campa

πŸ› πŸ’»
Image
Ira Miller

πŸ›
Image
Rhys Arkins

πŸ’»
Image
Sean Larkin

πŸ’»
Image
Daniel Ruf

πŸ’»
Image
bokuweb

πŸ’» πŸ“– ⚠️
Image
Hiroki Osame

πŸ’» πŸ“–
Image
Jakub Jankiewicz

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

πŸ› πŸ’»
Image
burningTyger

πŸ›
Image
Melvin Carvalho

πŸ“–
Image
akaJes
πŸ’»
Image
Dima Sabanin

πŸ› πŸ’»
Image
Koutaro Chikuba

πŸ› πŸ’»
Image
Hubert SABLONNIÈRE

πŸ’» ⚠️ πŸ€” πŸ”
Image
David Duarte

πŸ’»
Image
Thomas Pytleski

πŸ› πŸ’»
Image
Vadim Markovtsev

πŸ›
Image
Yu Shimura

πŸ€” πŸ’» ⚠️
Image
Dan Lynch

πŸ’»
Image
Jeffrey Wescott

πŸ› πŸ’»
Image
zebzhao

πŸ’»
Image
Tyler Smith

πŸ›
Image
Bram Borggreve

πŸ›
Image
Stefan Guggisberg

πŸ› πŸ’» ⚠️
Image
Catalin Pirvu

πŸ’»
Image
Nicholas Nelson

πŸ’» ⚠️
Image
Anna Henningsen

πŸ’»
Image
Fabian Henneke

πŸ› πŸ’»
Image
djencks

πŸ› πŸ’» ⚠️
Image
Clemens Wolff

πŸ’» πŸ“– ⚠️
Image
Sojin Park

πŸ’»
Image
Edward Faulkner

πŸ’»
Image
KhαΊ£i

πŸ›
Image
Corbin Crutchley

πŸ’» πŸ“– ⚠️
Image
Riceball LEE

πŸ’» πŸ“– ⚠️
Image
lin onetwo

πŸ’»
Image
ζž—ζ³•ι‘«

πŸ›
Image
Will Stott

πŸ’» ⚠️
Image
Seth Nickell

πŸ›
Image
Alex Titarenko

πŸ’»
Image
Misha Kaletsky

πŸ’»
Image
Richard C. Zulch

πŸ’» πŸ“–
Image
mkizka

πŸ’»
Image
RyotaK

πŸ›
Image
Noah Hummel

πŸ’» ⚠️
Image
Mike Lewis

πŸ“–
Image
Sam Verschueren

πŸ’»
Image
Vitor Luiz Cavalcanti

πŸ“–
Image
Shane McLaughlin

πŸ’» πŸ“– ⚠️
Image
Sean Poulter

🚧 πŸ’» πŸ“– ⚠️
Image
araknast

πŸ’» ⚠️ πŸ“–
Image
Rafael Raab

πŸ’» πŸ“–
Image
LukΓ‘Ε‘ Cezner

πŸ’» πŸ“– ⚠️ πŸ›
Image
dead-end

πŸ’» πŸ“– ⚠️
Image
Barry

πŸ’» πŸ“– ⚠️
Image
Alireza Mirian

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

πŸ’» πŸ“– ⚠️
Image
Eyal Hisco

πŸ›
Image
Sebastien

πŸ’»
Image
Yaroslav Halchenko

πŸ“–
Image
Alex Villarreal

πŸ’»
Image
Modesty Zhang

πŸ’» πŸ“– ⚠️
Image
Ben Morrow

πŸ’»
Image
jayree

πŸ’» ⚠️
Image
Lucas Martin Segurado

πŸ“– πŸ›
Image
Leon Kaucher

πŸ’» ⚠️
Image
Gili Shohat

πŸ’» πŸ“– ⚠️
Image
Habib

πŸ’» πŸ“– ⚠️
Image
Vinzent

πŸ’»
Image
James Prevett

πŸ’» ⚠️ 🚧
Image
Patrick Kranz

πŸ’» πŸ“– ⚠️
Image
Luke Cotter

πŸ’»
Image
Tom Larkworthy

πŸ“–
Image
Mostafa Mahmoud

πŸ’» ⚠️ πŸ’¬
Image
Aniket Bhosale

πŸ’» πŸ“– ⚠️
Image
Mathias Nisted Velling

πŸ’» ⚠️
Image
acandoo

πŸ“¦ πŸ““
Image
Patrick Kranz

πŸ’» πŸ“– ⚠️
Image
Luke Cotter

πŸ’»
Image
Tom Larkworthy

πŸ“–
Image
Mostafa Mahmoud

πŸ’» ⚠️ πŸ’¬
Image
Aniket Bhosale

πŸ’» πŸ“– ⚠️
Image
Mathias Nisted Velling

πŸ’» ⚠️
Image
acandoo

πŸ“¦ πŸ““
Image
Bekatan Satyev

πŸ’» ⚠️
Image
Hemanth Kini

πŸ’»
Image
Anish Awasthi

πŸ’» πŸ“– ⚠️
Image
fetsorn

πŸ“–
Image
xiaoboost

πŸ’» πŸ“– ⚠️
Image
Mateusz BurzyΕ„ski

πŸ’» ⚠️

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

Backers

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

Image

Sponsors

Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor]

Image Image Image Image Image Image Image Image Image Image

License

This work is released under The MIT License

FOSSA Status

About

A pure JavaScript implementation of git for node and browsers!

Topics

Resources

License

Code of conduct

Contributing

Stars

Watchers

Forks

Sponsor this project

Packages

No packages published

Contributors 116