如何从mercurial存储库中安全地禁用/删除largefiles目录?

Ste*_*han 4 version-control mercurial large-files mercurial-extension

在过去,我一直在使用mercurial中的largefiles扩展来将数据与我一直在处理的代码一起保存.我认为这是一个错误,我想删除"largefiles"目录(8GB).我们的网络用户目录限制为10 GB,我需要空间.我很久没有使用任何大文件了.当他们永远消失时,我不会想念他们.

所以我的问题是

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

Mar*_*nen 5

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

  1. 用大文件创建了一个repo.
  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
Run Code Online (Sandbox Code Playgroud)

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

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

exclude .hglf
Run Code Online (Sandbox Code Playgroud)

并运行:

hg convert --filemap <file> <srcrepo> <destrepo>
Run Code Online (Sandbox Code Playgroud)

然后,您的用户必须克隆这个新的,已修改的存储库,因为convert会修改更改集,并且新数据库将与旧数据库无关.