2013-03-14 73 views
5

另请参阅this question如何从Mercurial repo中删除大文件

不知道我在做什么,我启用了largefiles扩展,提交了一个文件并将其推送到窑中。现在我知道我的方式错误了,我需要永久地恢复这种变化。

我遵循SO关于主题的指导;我可以在本地删除大文件,但这不会影响窑中的远程回购。我已经尝试在Kiln服务器上打开KilnRepositories中的repo,并且nucking largefiles文件夹(以及从需要的文件中删除'largefiles'),但是在几次推/拉文件夹和require的行后回来。

有没有办法使这永久? (需要只读的设置也不起作用)。

回答

10

注意:至少对于Windows版本的TortoiseHg 2.4(Mercurial 2.2.1) - > 2.7.1(Mercurial 2.5.2)是如此。我不会为未来或旧版本发言。

查看各种可用的mercurial扩展后,我得出结论,一旦使用largefiles扩展提交了一个文件后,通常无法将存储库“返回”。

首先,您为什么不希望在您的回购中使用大型文件的两个原因:onetwo

一旦文件已被提交为一个大文件,要删除它,所有对'.hglf'路径的引用必须从回购库中删除。 A backout是不够的,因为它的提交内容将引用文件的路径,包括'.hglf'文件夹。一旦mercurial看到这个,它会将'largefiles'写回/.hg/requires文件,并且repo再次被锁定为大文件。同样用hg忘记和删除。选项1:如果您的回购是孤立的(您在所有本地和远程位置都有对回购的端到端控制,并且没有其他人从此回购分支中分出),则可以使用mq扩展名和strip变更集。如果你及时发现了错误,这可能只是一个可行的选择。选项2:如果在作为草稿的提交phase上存在违规变更集(大文件提交),则可以使用hg将提交导入mq并将提交导入到unapply the changeset中。 qpop。这优于剥离,因为它从提取的变更集中向前保留了提交历史记录。在现实生活中,这往往是不可能的,因为你可能已经进行了合并,并从公共阶段分支中推送/拉出。但是,如果发现不久,mq可以提供一种挽回回购的方法。选项3:如果在一个且只有一个地方引用了有问题的变更集(原始提交),并且没有人试图撤销/删除/忘记changset(从而创建多个引用),则有可能使用hg rebase,将犯罪后的第一个孩子变更集合与犯罪的父变更集合在一起。在这样做的时候,冒犯性的变化集会成为一个新的头部,然后可以用mq strip剥离。这可以在尝试导入到mq失败的情况下工作。

方案4:如果以上工作,你可以使用transplantgraft,所有非违规变更集,然后汞柱更新导出为补丁(小心将它们导出正确的顺序),到第一理智进攻前的变更集,mq取消所有前进变更集的回购,然后依次重新应用导出的补丁。

选项5:(我最终做到了)。在本地克隆回购,以便您拥有两个副本:clone_to_keep,clone_to_destroy。在clone_to_keep中,在犯罪前更新为第一个理智的变更集。 Mq剥离所有正向变更集。如果留下多个头,请合并回去。在clone_to_destroy中,更新到提示。在Windows资源管理器中,将除.hg和.hglf文件夹之外的/ clone_to_destroy中的所有内容复制到/ clone_to_keep文件夹。在Tortoise内部,将clone_to_keep中的所有更改作为单个更改集提交。为了历史目的,以只读状态保存一个clone_to_destroy远程实例,并销毁所有其他实例。

选项6:核选择。如果一切都失败了,如果你不关心与外部系统(bug跟踪,CI等)的回购整合,你可以按照上述SO post和使用汞convert扩展。这将创建受感染的repo的新副本,删除所有对违规变更集的引用;但是,它通过迭代整个回购中的每个变更集并将其作为新变更集提交给新回购来实现。这会创建一个与任何现有分支仓库不兼容的仓库 - 这些更改集ID都不会排列。除非你没有分支回购,否则这个选项可能永远不会起作用。

在任何情况下,你就必须把你的修复和手动重新申请每个不同的存储库实例(复制回购文件夹,克隆,无论你的首选方法)。

最后,事实证明,使大型文件是一个非常昂贵的错误作出。这很费时间,最终会破坏。我不建议让大文件进入你的回购站。

+0

看到http://stackoverflow.com/a/14453480/492 – 2014-11-18 18:06:53

相关问题