3

不小心我签入了大约 5GB 的文件到 Mercurial。在克隆 repo 期间,我们的构建服务器开始失败。因此,我们使用 Remove 命令恢复了签入的文件。但是 .hg/store/data 仍然包含这些文件。它的大小超过5GB。我们在互联网上搜索并发现了一些方法,例如:hg convert。但是 hg convert 正在创建新的 repo,这在我们的案例中是不需要的。我们也不能延长构建服务器的超时时间。

我们如何才能完全删除错误签入而不将其存储在 .hg/store/data 中?或者我们如何减少 .hg/store/data 的大小?

4

2 回答 2

2

这是您需要做的:您需要剥离这些变更集。

由于您的存储库托管在 Bitbucket 上,因此您无法直接访问文件,因此您需要使用网站提供的内容。

在您的存储库项目中,在设置下,有一个用于剥离变更集的部分。

请注意,这还将删除在错误变更集之上提交的所有变更集。我们将处理这个问题。

我会强调这一点:

  1. 制作
  2. 当然
  3. 备份!

以下是步骤

重要提示:如果您团队中的任何开发人员在本地有任何待处理的内容,例如尚未将变更集推送到 bitbucket,但他们已经从 bitbucket 克隆了错误的变更集,那么您需要进行更多的嫁接,确保您了解需要的所有内容在尝试此操作之前完成。

  1. 确保您有良好的备份存储库的本地克隆,这是最重要的,如果您最终丢失要在此过程中保留的变更集,我(或 Stack Overflow)概不负责。特别注意上面关于其他开发人员可能拥有的未推送变更集的警告。
  2. 在本地克隆中,首先将在错误变更集之上提交的所有变更集移植到直接位于它之前的变更集上。

    IE。如果历史看起来像这样:

    1---2---3---BAD---5---6---7
    

    您想将 5-7 移植到 3 之上,以便您之后拥有以下历史记录:

    1---2---3---BAD---5---6---7
             \
              +--5---6---7
    
  3. 然后使用以下命令删除错误的变更集(及其后面的所有内容):

    hg strip BAD
    
    `BAD` here is the number or hash of the bad changeset
    
  4. 验证一切在本地看起来都不错,然后前往 bitbucket.org
  5. 找到您的存储库,进入设置并找到剥离变更集部分
  6. 输入错误变更集的哈希并要求 bitbucket 将其删除
  7. 之后,从本地克隆推送,将移植的变更集带回 bitbucket
  8. 重要提示:现在您需要让已经从 bitbucket 克隆并获得错误变更集的每个人都需要废弃他们的本地克隆并重新克隆。这将关闭存储库的新副本,而不会出现错误的变更集。
于 2016-08-29T06:35:38.570 回答
1

-r选项hg clone允许在特定修订后创建没有变更集的存储库。

因此,您可以执行以下操作(假设LAST_GOOD_CHANGESET是在您错误提交之前的变更集):

hg clone -r LAST_GOOD_CHANGESET repo repo.1
mv repo repo.bak
mv repo.1 repo

但是请注意,这将在您的错误提交后丢弃所有提交,因此您将不得不重播重要的提交(即排除那些试图修复错误的提交)。

此外,如果您有分支,则必须将它们列为附加-r参数hg clone,否则它们也会从清理的存储库中删除。

于 2016-08-29T05:49:13.610 回答