有没有办法在Mercurial中删除单个文件的历史logging?
我想我已经知道了这个答案,但是我想我会问:
我们有一个文件被添加到一个Mercurial存储库中,里面有敏感信息。 有没有办法删除该文件及其更改历史logging,而不删除整个回购?
不,你不能。 阅读本应该从来没有过的有关它的红酒书的变化 ; 特别是有关敏感的变化,逃避小节,其中包含这一段:
Mercurial也没有提供使文件或变更集完全从历史中消失的方法,因为无法强制执行它的失踪; 有人可以很容易地修改他们的Mercurial副本忽略这样的指令。 另外,即使Mercurial提供了这样的function,那些根本就没有拉上“让这个文件消失”的变化集也不会受到影响,爬虫也不会在错误的时间访问磁盘备份或其他机制。 事实上,没有分布式版本控制系统可以使数据可靠地消失。 提供这种控制的错觉很容易给人一种虚假的安全感,而且比根本不提供这种安全感更糟。
通过backout
命令(mercurial book: 处理已提交的更改 )支持恢复已提交更改的常用方法,但信息不会从存储库中消失:因为您永远不知道是否完全克隆了存储库,虚假的安全感,如上所述。
从Mercurial中删除特定文件是正确的,因为这样做会破坏存储库中的所有变更集ID。 当您更改变更集ID时,每个人都必须重新克隆存储库。 有关修改Mercurial中的历史logging后果的信息,请参阅Wiki页面中有关编辑历史logging的信息。
如果这对你(公司的内部仓库)是好的,那么看看转换扩展 。 它可以执行hg→hg转换,并有一个–filemap参数,可用于排除文件等等。
它可能是本地的,但不是全局的,它会在添加文件之后更改每个提交的ID。 为了保持更改,您需要访问存储库的每一个副本,特别是那些从中拉出或推出的副本。
也就是说,我遵循Mercurial wiki上描述的编辑历史序列,从我的一个仓库中删除一个文件。 此序列假定修订版本1301:5200a5a10d8b添加了文件path/to/badfile.cfg
,后续修订中未更改:
-
在
.hgrc
启用MQ扩展:[extensions] mq =
-
从上游拉取最近的更改。
hg pull
-
将所有文件从文件中导入到MQ中:
hg qimport -r 1301:tip hg qpop -a
-
从添加它的提交中删除文件。
hg qpush 1301.diff hg forget path/to/badfile.cfg hg qrefresh
-
将补丁转换成新的Mercurial版本。
hg qpush -a hg qfinish -a
-
向上游推送新版本。
hg push -f
-
在上游存储库和其他所有副本上,删除旧版本。
hg strip 5200a5a10d8b
警告 :除非您小心,否则此步骤可能会破坏工作。 如果有人自上次从上游拉出任何东西,那么在剥离之前你必须重新分配这个工作。 不幸的是,这里的rebase
扩展没有帮助。 您将不得不再次使用MQ,将新的提交转换为您应用到新提示中的修补程序。
祝你好运。
它可以在10分钟内完成。 在一个存储库中,虽然有后果。
如何:使用这个优秀指南中描述的hg convert。 基本上,您将Hg回购“转换”为新的Hg回购,但您可以指定在转换期间排除的文件列表。 这是关键步骤的摘录:
Make sure all your teammates have pushed their local changes to the central repo (if any) Backup your repository Create a "map.txt" file: # this filemap is used to exclude specific files exclude "subdir/filename1.ext" exclude "subdir/filename2.ext" exclude "subdir2" Run this command: hg convert --filemap map.txt c:/oldrepo c:/newrepo NOTE: You have to use "forward-slash" in paths, even on windows. Wait and be patient Now you have a new repo at c:\newrepo but without the files
至于后果…
- 您想要排除的文件添加后的所有变更集ID将会不同
- 新的“干净的”主存储库将不得不被手动replace现有的
- 所有的团队成员将不得不作出主要回购新的克隆
- 任何其他与汞结合的服务可能需要注意(例如问题跟踪器,代码审查系统等)
hg移植,然后hg strip