5

过去,我一直在使用 mercurial 中的 largefiles 扩展来保存数据以及我一直在处理的代码。我认为这是一个错误,我想删除“大文件”目录(8GB)。我们的网络用户目录限制为 10 GB,我需要空间。我已经很长时间没有使用任何大文件了。当他们永远离开时,我不会想念他们。

所以我的问题是

  1. 我可以在不损坏 repo 的情况下删除 .hg 下的 largefiles 目录吗?
  2. 如果我这样做了,即使丢失了一些大型数据文件,我是否能够检查出旧代码?
  3. 我是否应该从该存储库的所有克隆中删除这些文件,以避免再次使用来自另一个克隆的大文件污染所有存储库?
4

2 回答 2

5

对于你的第一个问题,我做了一个实验:

  1. 创建了一个带有大文件的仓库。
  2. hg update null
  3. 已删除.hg\largefiles
  4. hg update

大文件回来了!事实证明,至少在 Windows 上,大文件也缓存在%UserProfile%\AppData\Local\largefiles. 由于这是我唯一的大文件数据库,它只包含我的一个大文件,所以我也删除了它。这个缓存包含来自多个本地启用大文件的数据库的大文件,所以你必须小心这个。如果拥有两个副本似乎很浪费,那么事实证明,如果本地数据库与%UserProfile%. 我的系统中有两个驱动器,事实证明,如果数据库位于不同的驱动器上,它仍会复制到该AppData位置,但不是硬链接,并且会使您的磁盘使用量翻倍。

删除大文件的所有副本后,hg update给出:

1 files updated, 0 files merged, 0 files removed, 0 files unresolved
getting changed largefiles
largefile.dat: can't get file locally
(no default or default-push path set in hgrc)
0 largefiles updated, 0 removed

然后我删除[extensions], largefiles=.hg\hgrc禁用扩展。此时存储库工作正常,但.hglf在过去有大文件的变更集中仍然有带有哈希的目录。所以第二个问题的答案是肯定的,你可以查看旧代码。

对于您的第三个问题,要消除大文件和散列的所有痕迹,请创建一个文件:

exclude .hglf

并运行:

hg convert --filemap <file> <srcrepo> <destrepo>

然后,您的用户将不得不克隆这个新的、修改过的存储库,因为 convert 会修改变更集,并且新数据库将与旧数据库无关。

于 2013-01-22T07:22:06.653 回答
2

将普通存储库转换为大文件的相同命令lfconvert也可用于其他方向:

$ hg --config extensions.largefiles= help lfconvert
hg lfconvert SOURCE DEST [FILE ...]

convert a normal repository to a largefiles repository

Convert repository SOURCE to a new repository DEST, identical to SOURCE
except that certain files will be converted as largefiles [...]

Use --to-normal to convert largefiles back to normal files; after this,
the DEST repository can be used without largefiles at all.

所以下面的命令可以解决问题:

$ hg --config extensions.largefiles= lfconvert --to-normal <LARGEFILE_REPO> <PLAIN_REPO>

您需要与您的团队协调,以便:

  1. 每个人都将他们的最新更改推送到大文件主存储库
  2. 永久禁用对主仓库的访问(以避免意外推送)
  3. 每个人都largefiles从他们的$HOME/.hgrc
  4. 从提供对主存储库的访问权限的用户中删除largefiles扩展名(位置取决于主存储库是服务器、SSH 还是 HTTP)。这将使某人不可能不小心将大文件添加到新仓库的克隆中并推送它!hgrchgrc
  5. 执行主仓库到普通仓库的转换
  6. 决定新主仓库的名称/路径更改(如果有)
  7. 允许访问新的、普通的主存储库
  8. 每个人都克隆新的普通回购

请注意,lfconvert仅在largefiles启用扩展时才可用。我的建议是,按照第 3 点,从$HOME/.hgrc带有选项的单个命令中删除它并启用它--config extensions.largefiles=,如上面的示例所示。

另请注意,转换为普通 repo 将启用最近的fsmonitor扩展,它使用内核 inotify 机制(或 MacOSX 上的等效机制)来显着加快某些操作,例如hg status. 例如对于我拥有的一个巨大的存储库,hg status从 10 秒到 0.5 秒 :-)

于 2016-06-20T09:57:27.323 回答