3

在我们的 Mercurial 存储库中,我们添加了一个非常大的文件(并进行了 hg 推送),然后删除了大文件(并进行了另一次推送)。

现在,如果有人这样做,hg clone他们还会拉下那个大文件吗?我知道它不会出现在他们的工作目录中,因为它被删除了,但该文件是否仍会被拉下并存储在 Mercurial 内部存储中?

我想确保人们不必拉下文件。我了解到非常大的文件应该存储在 Mercurial 之外,所以我删除了该文件。但我想知道人们是否仍会拉下大文件——在这种情况下,我想我会从头开始重新创建存储库。

4

2 回答 2

6

当然,它仍然会在存储库中。

您始终可以更新回旧版本,并且如果您更新回提交文件时获得的版本,它将会在它的所有荣耀中存在。

有两种方法可以缓解这种情况(当您提交时,而不是现在):

  • 大文件扩展之一,它们本质上将大文件添加到辅助存储库并链接两者,因此如果您更新到文件不存在的修订版,并且您还没有它,它不会得到更新。IE。它更像是一种“按需”的拉动方式
  • 如果文件从不更改,请将其保留在网络上,并创建某种指向它的链接而不是完整副本

现在,您有四个选择:

  • 剥离添加文件的变更集,以及它之后的所有变更集。您可以使用 Mercurial Queues 扩展来做到这一点。请注意,您需要在所有克隆中执行此剥离。如果只有一个用户将其历史记录中包含该文件的存储库推回中央克隆,那么您就有了变更集。
  • 手动从头开始重建存储库
  • 使用hg convert命令和一些过滤,该--filemap选项可用于此
  • 保持原样。它有多大,会有很大的问题吗?

请注意,手动或通过重新构建存储库hg convert将使所有克隆无效。任何试图从旧克隆推送到新中央克隆的人都会收到关于unrelated repositories. 如果您的任何用户都 stupi^H^H^H^H^H 不够聪明,无法意识到强制推送是一个坏主意,那么您将遇到这种方法的问题。

于 2011-02-10T14:01:29.737 回答
4

是的,该文件仍在历史记录中。如果您想完全删除它,您需要使用 Mercurial Queues — 请参阅Mercurial wiki 上的Editing History 。

请记住,随着修订 ID 的变化,这会破坏克隆。

于 2011-02-10T13:53:56.923 回答