我知道在 Mercurial 中,“历史是神圣的”。
但是假设有人不小心提交了他们不应该提交的内容,例如包含密码或其他内容的设置文件。甚至可以说在任何人意识到它之前已经过去了一段时间,所以它已经徘徊了几个提交。显然,发现者随后会从存储库中删除敏感数据。
有没有办法从提交历史记录中永久清除该文件或敏感数据,就好像它从未存在过一样?或者这些敏感数据会永远永远是回购的永久部分吗?
我知道在 Mercurial 中,“历史是神圣的”。
但是假设有人不小心提交了他们不应该提交的内容,例如包含密码或其他内容的设置文件。甚至可以说在任何人意识到它之前已经过去了一段时间,所以它已经徘徊了几个提交。显然,发现者随后会从存储库中删除敏感数据。
有没有办法从提交历史记录中永久清除该文件或敏感数据,就好像它从未存在过一样?或者这些敏感数据会永远永远是回购的永久部分吗?
有几种方法可以做到这一点。所有这些都需要在引入更改后克隆您的存储库或从中提取变更集的每个人的合作。
使用哪种方法取决于提交数据的确切性质以及它在历史记录中的位置。所有这些都需要使用 Mercurial 扩展,并且无法使用核心 Mercurial 来完成。幸运的是,所有必需的扩展都默认随 Mercurial 一起提供,只需启用即可。
我不会在这里详细介绍这些方法,因为有几个答案在这个问题中给出了不同的方法,这是一个骗局。我只是想明确一点,该问题中接受的答案在技术上是正确的,但没有用。这实际上是可能的。
当且仅当此存储库没有逃到野外时,您可以通过实质上克隆到新存储库来从历史记录中删除文件,同时在此过程中过滤敏感文件,使用hg convert Hg Convert Extension doc here
通常,当我们在发布或交付给客户端之前审核存储库时,我们会发现一些东西,例如带有密码的 web.config 或 ini 文件。
默认情况下未启用该扩展,但我使用的所有客户端都包含该扩展,您需要先启用它,然后 Mercurial 才能识别转换命令。
如果使用 Tortoise Hg 或 Kiln,例如:
或者直接编辑 Mercurial.ini:
[extensions]
convert =
转到存储库上方的目录(在我的示例中,我的存储库是 HelloApp):
创建一个名为 filemap.txt 的文件
添加一行,其中包含要排除的文件名的完整路径。
exclude HelloApp/sensitive.config
打开命令提示符,cd 到包含您的 filemap.txt 的同一目录,然后运行 hg convert
cd C:\projects
hg convert --filemap filemap.txt HelloApp HelloApp_clean
然后获取最新的工作副本:
cd HelloApp_clean
hg update
您需要使用干净的副本在服务器上创建一个全新的克隆。
不,不是。如果您可以说服有权删除和重新克隆的每个人,您可以从将来的访问权限中删除该文件。
但是,例如,如果您将 root 密码推送到公共 Bitbucket 存储库 - ?你应该改变它。您的信息现在是公开的和泄露的,应该被视为这样。对不起。
我还没有研究钩子如何工作的细节,所以这个想法可能不会完全发挥出来。可以设置挂钩来禁止提交、推送和拉取敏感文件。在提交或推送 ( ) 之前会运行一些钩子precommit and preoutgoing
。Mercurial: The Definitive Guide还讨论了保护钩子使其不被规避的另一个问题。