Mercurial:从所有变更集中删除文件

14
我知道如何从历史记录中删除整个 changeset,但不清楚如何仅删除其中的一部分。

例如,如何在保留源代码的情况下从现有的 changeset 中删除所有 DLL 文件?


DLL文件存在于最新的Changeset还是较早的Changeset(或多个Changesets)中? - Niall C.
DLLs存在于较早的变更集中。 - Gili
2个回答

18
由于修订版本ID(例如a8d7641f...)基于变更集的哈希,因此不可能从历史记录中真正删除变更集的子集。但是,可以使用Convert扩展创建一个新的仓库,并使用文件映射来排除某些文件,将Mercurial仓库转换为Mercurial仓库,通过添加exclude来实现。这将创建一个新的、无关的仓库,这意味着任何人都不能再从它那里拉取克隆,并且必须重新从这个新仓库进行克隆。

有没有其他办法?假设你在一个100人的团队中。有人意外地检入了受版权保护的材料。或者可能他们错误地将一些用户数据作为测试的一部分检入了代码库。要求所有开发人员重新克隆似乎不可行,但你需要清除这些数据。难道没有其他选择吗? - gman
1
有这么大的团队,人们希望会有某种审查流程参与进来。 - Ringding

13
  1. 确保所有队友已经将他们本地的更改推送到中央仓库(如果有的话)
  2. 备份你的代码仓库
  3. 创建一个名为“map.txt”的文件,内容如下:
    # 这个文件用于排除特定的文件
    exclude "subdir/filename1.ext"
    exclude "subdir/filename2.ext"
    exclude "subdir2"
  4. 运行以下命令:
    hg convert --filemap map.txt c:/oldrepo c:/newrepo
    注意:即使在Windows上也必须使用“正斜杠”来指定路径。
  5. 耐心等待
  6. 现在你有了一个新的仓库,但是没有这些文件

PS. 在“原始”仓库中,你需要删除所有的变更集并重新推送你的新仓库。

PPS. 我实际上写了一篇关于此主题的博客文章,其中包含更多详细信息(包括在Bitbucket中剥离变更集等)。


2
随着新团队成员的加入,我猜我们可能会每年做一次这样的事情,以保持代码库不受所有新手提交的影响。 - Jeremy Smith
我的联合创始人不小心将整个PhoneGap库提交到了代码库(18兆字节),所以我必须通过艰苦的方式学习这一点,呵呵。 - Alex from Jitbit
如何排除某种类型的所有文件?我尝试使用“exclude *.bak”来从所有提交中排除所有备份文件(我忘记在.hgignore中包含它们),但没有起作用。 - sunny moon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接