颠覆:Merkle树和源代码控制


我宣布SvnMerkleizer几天前在推特上。它给Subversion增加了一个Merkle树功能。

为什么是颠覆,因为Git有一个保留历史的内置Merkle树?说实话,我几年前就开始了,想完成它,它也是一个测试平台Servirtium它向远程服务的Java客户端提供服务虚拟化。

尽管有更多的原因。

为这棵默克树的颠覆行为辩护

回购的规模

Subversion可以很容易地达到万亿字节,而Git有一个假设的上限。我是说,这是历史。对于Git,您可以使用--depth x克隆更少的历史。对于Subversion,它是隐式的--depth 1客户端的历史记录。当然,这两种情况下的服务器端都会保留所有历史记录。当然,Git-LFS将Git推向了一个更容易处理视频文件的位置,但是它并不是内置的。

读/写权限

Subversion可以维护每个目录的读写权限。它还可以将用户分组在一起,以使配置更加简洁,即使“授权”技术在新手手中非常混乱和容易出错。

部分回购结算

有了Subversion,你可以在一个子目录中创建一个“svn”,这就是你的客户端所需要的(没有父目录)。吉特没有那个。你必须克隆整个回购协议。

稀疏签出

Git和Subversion有稀疏的签出,它们的工作方式略有不同。我认为Git更容易使用。不过,Git没有稀疏克隆,这意味着在客户端存储上不会有任何节省.git/文件夹,即使工作副本作为checkout操作减少。

直接访问文件

假设,Subversion可以在repo中放入单个文件资源,而无需在此之前签出任何东西。

推/拉瓶颈

Subversion在提交之前不必是最新的。Git需要你在将变更推回之前先拉(并解决冲突)。

任意分支模型

Subversion允许你在目录树的任何一点上创建分支,但是那是一把非常锋利的刀,你可以用它来伤害自己。将他们的源放在同一个回购中的每个团队可以选择不同的分支模型和适合他们的任何子目录。必然有和Subversion一样的任意分支可能性。以性能规模为设计目标的塑料配置管理不允许任意分支。在这方面,它与Git和Mercurial是一样的,因为分支是在根目录(整个回购)创建和维护的。在单回购配置中,没有人会错过任意分支。

吉特鲜为人知的优势

直接访问Merkle树的SHA1表示

如果你在克隆后真的“结帐离开SHA1”,那么Git会很快带你回到那个时间点,不管那个分支在哪里。

即使使用SvnMerkleizer或类似工具,Subversion也不能让你直接访问以SHA1为根SHA1的树(因为它实际上是在Git中)。您可以将Subversion绕回给定的版本(数字序列),然后重新计算整个Merkle树。有了它,你可以通过反复试验找到你想要的那个。

事实上,如果Subversion在每次提交时都计算整个Merkle树,并使其可以长期使用,它会更好。新问题:树对于用户/组的每组权限都是不同的。

门户添加了直接更新访问

Gitea、RhodeCode和GitHub本身(以某种方式)增加了一种能力,使您能够在没有克隆资源的情况下,有效地将资源放入Git远程回购中。我有几个概念证明可以利用它: