isomorphic-git是在Node.js和瀏覽器JavaScript環境中起作用的GIT的純JavaScript重新實現。它可以讀寫到git存儲庫,從中獲取並推到git遙控器(例如github),所有這些都沒有任何本機C ++模塊依賴性。
同構GIT的目標是與規範GIT實施的100%互操作性。這意味著它通過在“ .git”目錄中修改文件來完成所有操作,就像您習慣的git一樣。隨附的isogit CLI可以在桌面或服務器上的GIT存儲庫上操作。
該庫的目標是無需組裝的完整解決方案。 API的設計是使用現代工具,例如匯總和WebPack。通過將功能作為單個功能提供,代碼捆綁器可以通過僅包含應用程序使用的功能來產生較小的捆綁包。
該項目包括類型定義,因此您可以在編輯中享受靜態類型檢查和智能代碼完成,例如VS代碼和代碼框。
該項目的原始作者(比利·希爾頓(Billie Hilton))離開了該項目,但該項目仍由兩名志願者維護:
但是他們沒有編寫太多代碼,主要是進行代碼審查,並嘗試回答問題,並且在吉特(Gitter)上,他們只是不想讓項目死亡。因此,您可以說這個項目是由社區驅動的(因為Jcubic始終回復問題)。這意味著,如果您希望實現一個功能,則需要自己執行此操作或找到願意為您編寫代碼的人。該項目在OpenCollective上有一些錢,如果您發現願意與某些雄鹿交換的Somoene(可能是您),我們可以將其花在一些開發上,但是我們沒有很多,所以不要期望擁有完整的Sallary。
如果您想幫助這個項目,則非常歡迎您這樣做。
以下環境在CI中進行了測試,並將繼續支持直到下一個破裂版本:
節點10 | Chrome 79 | 邊緣79 | Firefox 72 | 野生動物園13 | Android 10 | iOS 13 |
請參閱GitHub和發行博客文章上的完整髮行說明。
您可以從NPM安裝它:
npm install --save isomorphic-git
isomorphic-git中的“同構”表示相同的代碼在服務器或瀏覽器中運行。這很棘手,因為Git使用文件系統並提出HTTP請求。瀏覽器沒有fs模塊。節點和瀏覽器具有不同的API來提出HTTP請求!
因此, isomorphic-git不再依靠fs和http模塊,使您可以攜帶自己的文件系統和HTTP客戶端。
如果您在節點中使用isomorphic-git ,則使用本機fs模塊和提供的節點HTTP客戶端。
// 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 )如果您在瀏覽器中使用isomorphic-git ,則需要模擬fs API的東西。最簡單的設置和大多數性能圖書館是Lightningfs,它是由同一作者編寫和維護的,並且是isomorphic-git套件的一部分。如果Lightningfs不符合您的要求,同構GIT也應與Browserfs和Filer一起使用。這次isomorphic-git/http/node而不是同構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 >如果您使用的是ES模塊語法,則可以使用默認導入以便方便,或者命名導入,如果您使用的是捆綁器:
import git from 'isomorphic-git'
// or
import * as git from 'isomorphic-git'
// or
import { plugins , clone , commit , push } from 'isomorphic-git'在文檔網站上查看完整的入門指南。
然後查看有用的摘要頁面,其中包括社區編寫的更多示例代碼!
不幸的是,由於默認情況下,由於相同的原始策略, isomorphic-git只能從與正在運行的網頁相同的來源中克隆。這是非常不便的,因為這意味著出於所有實際目的克隆和推動存儲庫,必須通過代理來完成。
為此,存在 @Isomorphic-git/cors-proxy,您可以克隆或npm install 。對於測試或小型項目,您還可以使用https://cors.isomorphic-git.org-由Clever Cloud贊助的免費代理。
我希望最終將CORS標題添加到所有主要的Git託管平台上,並將在這裡列出我的進度:
| 服務 | 支持CORS請求 |
|---|---|
| Gogs(自主) | ✔ |
| gitea(自主) | ✔ |
| Azure Devops | ✔(用法注:需要身份驗證) |
| GitLab | 我的公關被拒絕了,但問題仍然開放! |
| Bitbucket | |
| github |
實際上,添加CORS標題只是兩行代碼! !簡單的東西。肯定會發生。
isogit CLI同構GIT帶有一個簡單的CLI工具,稱為isogit ,因為isomorphic-git類型很多。它實際上只是一個薄的外殼,它將命令行參數轉換為等效的JS API命令。因此,您應該能夠使用CLI運行任何當前或將來的同構GIT命令。
它始終以一個假設,即當前的工作目錄是git根。例如{ dir: '.' } 。
它使用minimisted來解析命令行選項,並將打印出等效的JS命令並精心打印輸出JSON。
CLI更像是快速測試isomorphic-git ,並不是真正的git CLI替代品。
該項目遵循語義版本控制,因此我可能會繼續更改API,但是除非有主要版本凸起,否則它們將始終兼容。
與我們分享您的問題和想法!我們喜歡那個。您可以在我們的Gitter聊天室中找到我們,或者只是在Github上創建一個問題!我們也是Twitter上的@isomorphicgit。
isomorphic-git開發設置類似於大型Web應用程序的設置。主要區別在於測試中涉及的駭客數量荒謬。我們使用Facebook的玩笑進行測試,這使得TDD快速而有趣,但是我們還使用了自定義駭客,以便使用Karma使用Jasmine在瀏覽器中運行相同的測試。我們甚至擁有自己的模擬服務器,用於服務GIT存儲庫測試固定裝置!
您需要安裝node.js,但其他所有內容都是DevDectionenty。
git clone https://github.com/isomorphic-git/isomorphic-git
cd isomorphic-git
npm install
npm test查看CONTRIBUTING文件以獲取更多說明。
沒有@Creationix和@chrisdickinson的開拓性工作,同構不可能是不可能的。 git是一個棘手的二進制混亂,沒有他們的示例(及其模塊!),我甚至無法完成這一目標。他們是之前的天才。
跨瀏覽器設備測試由以下方式提供:

謝謝這些好人(表情符號鑰匙):
威廉·希爾頓 ? ? | wdhtig ? | 馬克·麥克勞德(Marc MacLod) ? ? | 布雷特·扎米爾(Brett Zamir) ? | 丹·艾倫 ? ? | TomášHübelbauer ? | 胡安·坎帕 ? |
艾拉·米勒(Ira Miller) ? | Rhys Arkins | 肖恩·拉金(Sean Larkin) | 丹尼爾·魯夫(Daniel Ruf) | Bokuweb | Hiroki Osame | Jakub Jankiewicz ? |
霍華德戈德 ? | Burningtyger ? | 梅爾文·卡瓦略(Melvin Carvalho) | akajes | Dima Sabanin ? | Koutaro Chikuba ? | HubertSablonnière |
大衛·杜阿爾特(David Duarte) | 托馬斯·皮特斯基(Thomas Pytleski) ? | Vadim Markovtsev ? | Yu Shimura ? | 丹·林奇(Dan Lynch) | 杰弗裡·韋斯科特(Jeffrey Wescott) ? | Zebzhao |
泰勒·史密斯 ? | Bram Borggreve ? | Stefan Guggisberg ? | 卡塔林·皮爾沃(Catalin Pirvu) | 尼古拉斯·尼爾森 | 安娜·亨寧森 | 法比安·亨尼克(Fabian Henneke) ? |
djencks ? | 克萊門斯·沃爾夫(Clemens Wolff) | 索金公園 | 愛德華·福克納(Edward Faulkner) | khải ? | Corbin Crutchley | 萊克·李 |
Lin Onetwo | 林法鑫 ? | 威爾·斯托特 | 塞思·尼克爾 ? | Alex Titarenko | Misha Kaletsky | 理查德·祖爾奇(Richard C. Zulch) |
Mkizka | 瑞塔克 ? | 諾亞·漢梅爾(Noah Hummel) | 邁克·劉易斯 | Sam Verschueren | Vitor Luiz Cavalcanti | Shane McLaughlin |
肖恩·普爾特(Sean Poulter) ? | araknast | 拉斐爾·拉布(Rafael Raab) | 盧卡什·塞茲納(LukášCezner) | 死胡同 | 巴里 | Alireza Mirian |
Danilkazanov | Eyal Hisco ? | 塞巴斯蒂安 | Yaroslav Halchenko | 亞歷克斯·比利亞雷亞爾 | 本·莫羅(Ben Morrow) | Jayree |
盧卡斯·馬丁·塞古拉多(Lucas Martin Segurado) ? | Leon Kaucher | 吉利·肖哈特(Gili Shohat) | 哈比卜 | Vinzent |
該項目遵循全企業規範。歡迎任何形式的貢獻!
感謝我們所有的支持者! [成為支持者]
通過成為贊助商來支持這個項目。您的徽標將在此處顯示您網站的鏈接。 [成為贊助商]
這項工作是根據MIT許可發布的