为什么不删除Subversion的基本功能?

时间:2010-03-11 15:10:56

标签: svn obliterate

多年来,我正在等待Subversion具有“永久删除”(删除)功能。我对转换到Subversion(来自Visual SourceSafe:p)犹豫不决,因为我认为这是一个必不可少的功能,否则我会期望存储库不可阻挡地增长。但是,出于某种原因,该功能会一次又一次地被推迟。所以我开始想知道是否有其他功能或解决方法使得删除功能可有可无。

当您想缩小SVN中央存储库时,您会怎么做?

示例1 :我check in a large third party library,几周后我发现它不适合我的需要。我不希望它永远存储和备份大量数据。

示例2 :我在存储库中有10个版本的10个大型第三方库,但我只使用最新版本。

示例3 :我不小心检查了敏感信息(如John所示)。

示例4 :我不小心检查了一些从未打算放入存储库的大文件。

13 个答案:

答案 0 :(得分:19)

the Apache Subversion site对问题单上的{​​{1}}进行了大量讨论,其中大部分都是在2008年左右结束。似乎普遍认为这是一个很好的能力,尽管使用应该很少见。

有两个主要原因需要它。

首先,检查机密信息可能是个问题。将其留在那里,删除,不一定是一种选择,具体取决于保密程度和存储库的暴露程度。

其次,检查大量不应该检入的东西可以大大增加存储库的大小。磁盘空间现在通常很便宜,但它不是无限制的,文件空间还有其他方面可以解决。如果有必要通过网络连接发送存储库,那么这是额外的时间,可能重要也可能不重要。能够刻录包含整个存储库的CD-ROM或DVD-ROM可能具有真正的优势。

因此,它是一种有用的功能,目前通过转储,过滤和重新加载存储库来完成。根据我看到的报告,这很容易出错,可能很慢,并且需要关闭存储库。

显然,对于Subversion团队来说,这不是一个高优先级的功能,因为很多年来我们需要做的工作就是设计并实现它。毕竟,它应该很少完成,并有一个解决方法。但是,任何想要在Subversion上做大量工作的人都可以提供一个补丁(如果质量足够好)可能会实现。

答案 1 :(得分:11)

它违反了源控制的含义 源控制就是能够恢复以前的状态。如果您永久删除文件,则无法删除。

OTOH我不知道VSS所以我可能误解了“永久删除”

答案 2 :(得分:8)

反对它的明显原因是因为开发人员认为它会平衡使SVN变得更糟 - 当你意外地删除某些东西和你的/ trunk时,你能够修剪不需要的东西所带来的快乐将会因你的愤怒而相形见绌而相形见绌失踪了。

FogBugz具有完全相同的行为,在他们的情况下,它完全是设计我相信,保护用户自己。

答案 3 :(得分:7)

Obliterate违反了您希望拥有的版本控制原则。您要么不保存任何空间,要么以前的标签会被破坏。如果你删除了任何文件,你将无法返回真正的先前版本。

至于您对存储库增长的评论......任何存储库都会随着时间的推移随着更改的大小线性增长。这是源控制系统的重点。如果您不需要能够跟踪以前的版本,那么为什么不在某个地方粘贴共享文件夹呢?

答案 4 :(得分:6)

引用Subversion Obliterate, the forgotten feature,问题有三个组成部分,问题原因解决方案。既然你开始提出解决方案的问题,我将从那开始。

解决方案

正如您所注意到的,没有很好的解决方案。特别是如果你正在处理一个大型企业存储库,因为解决方案变得越来越难,repo变得越大。有一个名为dump / filter的功能,通过它你可以清理你不想要的东西的回购,但它不是那么容易使用,不是快速而且不依赖。

2008年之后,在svn团队中有一个small effort(跟随线程)在那里获得了一个消失的特征,但是这个努力死于沉默的死亡。

问题

我在开始时提到的文章实际上有一个很好的用例列表,其中一个人需要一个删除命令,并且516 issue thread开发人员实际上承认了它的优点。

唉,现在似乎为时已晚;它之后从未添加的真正原因是它现在几乎不可能实现它,因为它在最基本的层面上挂钩代码(也见解决方案下的小努力链接)。

来自FAQ entry

  

修订是不可变的树,它们相互依赖。从历史记录中删除修订版会导致多米诺骨牌效应,在所有后续版本中造成混乱,并可能使所有工作副本无效。

原因

问题是最初的删除特征被驳回,因为它不符合真实版本控制的原则。

再次来自FAQ entry

  

如何从存储库的历史记录中完全删除文件?    在某些特殊情况下,您可能希望销毁文件或提交的所有证据。 (也许有人意外地提交了一份机密文件。)这不是那么容易,因为Subversion是故意设计的,永远不会丢失信息

然而

我和很多客户一起使用SVN,现在拥有更大的团队和更大的项目,基本上从来没有真正的问题。是的,所提到的用例保证了一个消失的功能,但到目前为止,我不相信这是一个问题,你到处都是一遍又一遍。当然,这个特殊问题的本质是你只需要犯一次错误而且不能正常解决。

答案 5 :(得分:5)

因为从存储库中删除数据会破坏源控制的基本前提,即可以重现所有先前的状态并更改源树。如果你想从版本控制中删除某些东西,你可能会说“做错了”,正如他们所说的那样。

答案 6 :(得分:5)

我现在使用各种版本控制系统大约15年,从不需要像这样的功能。

我想知道你想要这个功能的原因是什么:

  • 光盘空间?考虑到光盘空间的价格,很难相信
  • 是否为版本控制提交了密码?那会教你的。转到并更改密码
  • 存储库的速度?听起来不是这样,但如果我考虑一个完全不同的系统,可能会有更好的表现。

答案 7 :(得分:5)

可以通过执行转储和加载来减小SVN存储库的大小。基本上如果你说你永远不想恢复到超过几年的东西,就可以转储存储库,根据时间过滤,然后重新加载转储。由于大小而想要删除单个文件,可能表明文件首先并不属于源控制系统。

答案 8 :(得分:5)

有一些脚本可以帮助您删除数据。关注this mailing list thread以获取更多信息。

这是一个很难的方法,因为版本控制的本质不是丢失数据,而是永久删除它。但是,如果你每年修剪一次或类似的事情,可以完成。

答案 9 :(得分:4)

源代码控制的全部内容是拥有存储库外观的完整历史记录。 obliterate命令违背了源代码控制的目的,并且在所有拥有它的版本控制系统中都是错误的。

SVN具有便宜的复制和廉价的分支,不需要文件的完整副本 - 只需更改位。它的中央存储库通常非常易于管理,因此不需要这种错误。

答案 10 :(得分:2)

Obliterate不是Subversion的基本功能,因为它实际上打破了版本控制的基本原则(即:记录所有历史记录)。

并且它不是必不可少的功能,因为无论如何都有解决方法(使用svnadmin和过滤)。

此外,该功能目前正在大力开展。有关详细信息,请参阅this post

答案 11 :(得分:2)

最后我检查过它是作为一个ADMIN功能,管理员已经可以转储/过滤/ broken_workaround并删除历史记录。关于审计跟踪,这不会改变当前的引用。如果绝对必须删除某些内容,那就不那么可怕了。

Svnadmin抹去是最需要的功能之一,开发者终于承认它应该存在(终于!8年后!!!)。并且它的宣传不存在,正在追逐用户远离SVN。

不幸的是,我不得不以艰难的方式了解这个“缺失的功能”。什么时候基本功能是什么功能?新用户开始听到这个并避免使用SVN。至于我,我现在使用Git。

不喜欢我的意见? Linus称SVN开发人员为蠢货,整个集中系统存在缺陷。我相信Linus是一位真正的专家,特别是他了解来源。

答案 12 :(得分:1)

我做什么 - 不使用颠覆。遗憾。

他们(开发人员)大家不同意你对这一关键特征的评估。没有阻止我现在工作的公司使用它;)我个人因为这个原因而排除颠覆。