Git“branchs”徽标将其分支扩展到节点的分布式网络中。

P2PGit存储库的分发工具比较

Git是由设计分散版本控制系统。yabo88软件下载任何人都可以运行git后台程序在存储库来启动一个Git服务器。您也可以使用常规的Web服务器主机资源库和超文本传输协议基础设施。不过,更常见的情况是,存储库通过集中的集线器服务(如BitBucket、GitHub和GitLab)进行分发。“在GitHub上抛出代码”并称之为一天是快速、简单和免费的。然而,也有越来越多的对等网络(P2P)还要考虑分布式选项。

如果你可以使用分发BitTorrent的P2P协议,而不需要中央服务器的Git仓库?而不必依赖于一个商业企业的托管,慷慨和基础设施。这背后GitTorrent的想法,实验Git的帮手和覆盖协议用于在流行的P2P协议传输Git仓库。

GitTorrent摒弃了中央代码分发服务器的想法。相反,它依赖于正在使用和参与该项目的贡献带宽和处理其分布谁的人。

类似的概念还冒出了周围的其他对等网络协议,包括逸协议和IPF公司. 每个实现都做出了不同的实现选择,最终得到的系统乍一看似乎相似,但具有根本不同的权衡和优先级。在本文中,我将深入探讨这些差异,并做一个全面的比较。

我将从下面的比较表开始,其中包含一些关键特性和限制。里面有很多东西要消化,我会在桌子下面依次讨论每一项。

P2P客户端的Git的比较表
特色 客户
GitTorrent HyperGit 伊吉斯远程 ipld远程
协议 BitTorrent的 DAT IPF公司
git的远程 gittorrent: hypergit: 强脉冲中子源: ipld:
项目活动 非活动(2015年) 非活动(2018) 有效(2020年) 活动(2019)
运行时 Node.js的
端发现 DHT(不自举) 跟踪服务器的mDNS-SD DHT,的mDNS-SD
回购。更新 GIT中服务器,副信道,DHT 对等群 强脉冲中子源 侧沟
回购易变性 可变的 不可变
包装策略 在按需包装 解压后
重复数据删除 无压缩 无,非压缩 全球性的,非压缩
文件大小限制 内存 没有内在的限制。 2 MB
数据丢失 当然不是。 当IPFS运行时,您的存储库将被删除GC.
哈希算法 SHA-1 Ed25519 SHA-256 SHA-1 / SHA-256

我将从讨论每个项目的状态开始,然后继续讨论他们如何以不同的方式做事。

项目活动

GitTorrent看到了发展的爆发在该项目似乎被之初已被放弃由其创建者.你会特别开出了几个安全和废弃警告,如果您尝试安装并运行它。它需要一些调整,以依赖和它的代码工作与今天的版本Node.js的运行时间。

HyperGit类似锯发展的最初爆发并且似乎也被抛弃了。这还需要一些修复小修复安装上最新版本Node.js的的HyperGit似乎是本文所讨论的那些的至少抛光选项。

IPF公司/IPLD已经看到了稳步发展,因为.该IPFS /IGIS叉走过来并解决许多IPFS / IPLD实施的限制。这两个IPFS实现是极其缓慢的过程来推动,即使它们发生在本地计算机上。

端发现

GitTorrent使用BitTorrent的主线分布式哈希表(DHT)的实施,发现其他人谁在分享你要下载的资源库。相反,在中央服务器上查询等数据库的,您查询的DHT其他参与者发现哪些同行主机的Git仓库你感兴趣的内容。

要连接到你需要去通过所谓的自举/服务器引入了DHT。GitTorrent的引导服务器已经因为离线.我前面所讨论的DHT怎么可能更加弹性.您可以配置不同的主线DHT兼容的引导程序服务器。然而,其他人使用GitTorrent还必须手动配置在同一DHT引导服务器。这使得它很难采取GitTorrent中的一个项目。

HyperGit依靠逸协议项目的跟踪服务器上。一个跟踪服务器是满足相同功能的DHT集中式数据库服务器。它跟踪哪些客户有从其他客户端库和答案查询。如由GitTorrent的引导服务器脱机是,跟踪服务器中另有分布式系统的单点故障。我已经录得超过21停运中的DAT协议的跟踪服务器2018和2019。

IPFS也使用DHT。它的DHT自举过程可以像其他方法一样从增加的弹性中获益。值得注意的是,HyperGit和GitTorrent使用DHT来发现Git存储库 - ,然后查询它发现的对等方谁拥有存储库的哪些部分或“块”。另一方面,IPFS对全局的每个数据块使用DHT。此设计是项目全局重复数据消除目标的一部分(稍后将详细介绍)。yabo88软件下载

然而,IPFS架构创建相比于其他协议而DHT流量的巨大开销。它也无法从假定的知识谁拥有你感兴趣的信息库的一个大块同行都可能受益也有你感兴趣的多块。

最后,Dat和IPFS可以通过多播DNS服务发现(mDNS-SD)发现即时本地网络(LAN)上的对等点。此过程 - 也称为零配置网络(Zeroconf),或Apple Bonjour或Rendezvous - 可用于对Git存储库感兴趣的所有人都连接到同一本地网络的office设置。然而,在这些远程工作的时候,它并没有那么相关或有用。

更新和易变性

DATarchives — as used by HyperGit — are append-only file systems. An archive’s creator holds a special private cryptographic key that allows them to append new data to the end of the archive. They can add new files and new revisions of existing files to it, but can’t remove or change an old version from the file system log. Everything is versioned.

网络中的对等方相互宣布他们拥有的存档的最新版本,同时查询更新的版本。

On the other hand, “archives” on BitTorrent — as used by GitTorrent — and IPFS are immutable. You normally can’t make changes to a “torrent” transfer or an IPFS file ones it has been created. Both protocols use a file’s cryptographic hash as its network address. Change the file and you change its hash.

GitTorrent通过在BEP-44:在DHT中存储任意数据.这种“任意数据”与相同的加密密钥为主体的洪流签署。为了推送更新,私有密钥持有者推动的最新哈希提交到DHT。

最初的客户端下载完整的Git仓库为一体的洪流创建的时间。然后,客户端可以查询DHT找到最新的承诺。然后,他们可以询问其他同行最新的版本之间的提交他们已经和最新提交它的DHT找到。我将讨论这个在下一节多一点。

该项目IPFS有一个实验侧项目称为星际名称服务(IPNS)地址。这就像在域名系统(DNS),但存储在DHT。如DNS,IPNS可以一个地址转换成另一种类型的地址。在IPNS的情况下,它变成一个可变散列成一个不可变的哈希值。您还可以使用一种叫做DNSLink捎带上同一类型的查找使用DNS,而不是互穿网络。

强脉冲中子源已经被自成立以来的不可靠性和性能不佳的困扰。我建议你使用DNSLink代替IPNS与IPFS。请记住,DNS旨在通过类似的特征是yabo88软件下载分散辅助授权服务器以及缓存递归左轮手枪。

你强脉冲中子源地址或启用了DNSLink的域名将解析为的版本库的最新提交的哈希IPFS。该IPFS / IGIS实施支持上的Git为推动IPNS自动执行此操作。该IPFS / IPLD实施需要手动更新您的IPNS或DNSLink或通过其他侧信道进行通信的更新。

包装策略和重复数据删除

通常Git包的目标文件(提交)转换成压缩单文件对象。这些被放气,压缩磁盘上的同一组内删除重复的重复数据,缩小其文件大小。这大大降低了您的Git仓库的磁盘存储需求。Git的可能需要重新包装这些包文件时提交的(从下降分支如)孤儿,或以提高包装效率。

你不想做随着时间的推移在分布式文件系统的变化,以现有的数据,虽然。毋变化的数据,每个人都已经有一个副本的要求他们一个稍微不同的包装内重新下载相同的数据。一个Git的数据有效载荷提交被认为是不可改变的(不变的)。这是将解压Git仓库进场。

你可以简单地选择将您的资料库中没有使用对象包装。打开包装的库存储每次提交一组单独的文件,而不是被包装整齐的所有成一个压缩文件。这听起来似乎是一个微不足道的差异。然而,Git的软件项目库(如提交的07d8ea56f2)为118 MB包装和2,8 GB解压缩。那是一个巨大的2273%的增长在数据量的人都需要下载,以获取Git项目库的副本。

IPFS对象是内容可寻址的和不可改变的。您不能修改一个文件,而不改变其IPFS地址。IPFS”整个交易,但是,内容寻址数据的全局重复数据删除。该添加完全相同的两个文件IPFS节点最终会具有相同内容的地址吧。This also means that — assuming the Git repository is unpacked — each individual Git object is de-duplicated globally.

全局重复数据删除技术,相对于对等网络分布,是最有趣至于分叉库。新贵项目,从既定的项目叉关闭将分享提交历史(和主机)与永恒的父版本库。越多的人有兴趣相同的内容块,更大的可用性和长寿IPFS网络。每个项目的收益将有更多的共享数据块在网络中提高可用性。

IPFS寄托服务可以帮助您提高Git仓库的可用性。然而,他们可能重复块的超额收费.

BitTorrent和DAT,而另一方面,完全以一个“种子”或“DAT档案”的模型周围。数据只是其中的一个对象周围的交换,它从来没有跨越。BitTorrent的有模糊定义的标准浸出块了另一个莫名其妙相关洪流的下载被假定为可能已下载。这不是在许多客户实施,它不是在GitTorrent发现无论是。

不过,GitTorrent比一般的BitTorrent客户端更聪明。它可以请求对等方打包并传输它需要的一组Git对象。E、 g.如果最后一次提交是提交aaaa级而最新的承诺是DDDD,它可以请求对等方打包这两个提交之间的所有提交。发送者需要花费额外的处理时间为每个接收器组装和压缩一个包。然而,这种方法大大减少了发送大量小文件所涉及的磁盘I/O和网络开销。这类似于“Git smart”web服务器的工作方式。

HyperGitis built on top of HyperDB — an append-only database — and Dat. Existing database entries are immutable. HyperGit stores Git objects directly in the database unpacked. Although the Git objects are “packed” into a single database file, it can’t take advantage of compression. The database itself is also immutable. Like with the IPFS implementations, you end up with the same file size bloating effecting both transfer sizes and increased storage requirements.

数据丢失

P2P可以很好地分发存储库的冗余副本。任何对它感兴趣的人,至少是暂时的,也会参与主持和分发它。每个项目合作者将至少间歇性地参与其分发,并拥有整个项目的完整备份副本。

然而,IPFS选项来一个巨大的警告。一个IPFS节点将缓存和分发经过它的所有数据。这会占用大量的本地存储容量。IPFS节点使用垃圾收集器从本地IPFS存储库中清除临时缓存的数据,以便根据需要释放磁盘空间。垃圾收集器将删除存储库中尚未“固定”的每个对象。

双方在初始化或推到IPFS-Git仓库的IPLD和IGIS实现引脚Git对象。然而,无论是钉住库的根目录下!根目录是文件的集合,一起组成了仓库。你不会失去本身的数据,因为Git对象是安全的。但是,你失去持有其结合在一起的主要对象。这也是你直接和其他的参与者分享他们拉你的资料库的完整副本的散列。你也许能够从谁没有运行垃圾收集器的另一个贡献者检索库根目录的副本。

文件大小限制

WebTorrent,这GitTorrent是基于,存储在存储器中的文件。您通过GitTorrent下载单个文件不能超过可用内存容量。

这听起来不错,但星际关联数据(IPLD),GIT中的对象的哈希值和相应的对象IPFS之间的映射层,是只限于下2 MB。这应该是较小的项目,只要你不重构整个项目一气呵成或大型艺术或其他二进制资产添加到存储库的罚款。

无论HyperGit或IGIS具有任何内在的文件大小限制。HyperGit可以随机产生错误信息,说一些关于8 MB为最大。这是基本的Dat实施暂时性的问题,而不是仅仅是相切关系到你的Git仓库。大文件打交道时的Git本身也变得缓慢,但是。

哈希算法

BitTorrent协议使用SHA-1来识别和定位的文件传输。SHA-1已弃用多年,但是。它被认为是最好的一个弱哈希签名。它甚至被证明有可能产生可控的散列碰撞;从不同的输入数据相同的哈希值。

BitTorrent协议版本2将协议迁移到SHA-256。是264倍不太可能得到与SHA-256散列冲突。第2版​​已在书里,但再也没有出现过许多实现。GitTorrent,是基于该WebTorrent网站项目,使用协议版本1的WebRTC变体。

GIT中也使用SHA-1到内部参考的提交。但是,它也有可能签署一个提交平均绩点以加强安全。

IPFS”姐妹项目,星际关联数据(IPLD),是GIT中的对象的哈希值和相应的对象IPFS(SHA-256)对于相同的数据之间的映射层。要更换git的承诺,你需要创建的SHA-1的Git对象和相应的IPFS对象即碰撞。星际的Git服务(IGIS)实现不与IPLD转换层的麻烦和依赖于SHA-256专用。

结论

点对点Git托管对某些人来说可能很有吸引力。至少,听起来很吸引我!然而,在深入研究这个主题之后,许多当前的实现听起来没有那么吸引人。

我不认为任何人都应该使用任何P2P选项,除非他们致力于也在努力提高的工具。它太复杂上手,他们是很难理解不够自信地使用它们部署。你不想这么复杂项目的分配方法,它成为一个不合理的负担其通过。

GitTorrent似乎已经取得了P2P覆盖GIT中的最佳执行。不像其他的选项,它并没有从依靠解压Git仓库巨大的存储和传输大小开销。但是,它不能使用外的开箱,它需要一些工作,以解决安全问题并更新其依赖关系。

红利:分散期权

所以,也许对于Git的分布式选项是还没有应用。但是,你也可以考虑使用一个分散的选项,而不是。而不是依靠同行在网络上的,分散的选择依赖于一个或多个服务器。

如果你只是不想在GitHub上托管下一个项目,那么就在web服务器上托管它。它简单快捷,有助于增加Git托管生态系统的多样性。

还有比有P2P可供选择更加分散的选项。这是更容易实现分散化的选择,因为一个或采取了很多的你介绍使用P2P实现复杂度的护理更集中的服务器。这两个最显着的选项是Git的本身,安全的传言(SSB)。

分散的Git的客户端比较表
客户 混帐(+任何web服务器) GIT-SSB
协议 Git的,HTTPS HTTPS 固定天窗
git的远程 混帐混帐:, + HTTPS: HTTPS(“哑”) GIT-SSB:
地位 有效(2020年)
包装策略 在按需包装 压缩或未压缩 解压后
文件大小限制策略 无限 5 MB(软)