当前位置:  开发笔记 > 后端 > 正文

有没有办法在Mercurial中删除单个文件的历史记录?

如何解决《有没有办法在Mercurial中删除单个文件的历史记录?》经验,为你挑选了4个好方法。

我想我已经知道答案,但我想我会问:

我们有一个文件被添加到Mercurial存储库中,其中包含敏感信息.有没有办法删除该文件及其更改历史记录而不删除整个回购?



1> Martin Geisl..:

从Mercurial中删除特定文件是正确的,因为这样做会破坏存储库中的所有变更集ID.更改变更集ID时,每个人都必须重新克隆存储库.有关修改Mercurial中历史记录的后果的信息,请参阅有关编辑历史记录的Wiki页面.

如果您可以(公司内部存储库),那么请查看转换扩展.它可以执行hg→hg转换,并且有一个--filemap参数,可用于排除文件等.



2> Nicolas Duma..:

不,你不能.阅读应该从未出现过关于它的多变红皮书的变化 ; 特别是关于逃避子部分的敏感变化,包含这一段:

Mercurial也没有提供使文件或变更集完全从历史中消失的方法,因为没有办法强制执行它的消失; 有人可以轻松修改他们的Mercurial副本以忽略这些指令.此外,即使Mercurial提供了这样的功能,只是没有提取"使此文件消失"变更集的人不会受到影响,网络爬虫也不会在错误的时间访问,磁盘备份或其他机制.实际上,没有分布式修订控制系统可以使数据可靠地消失.提供这种控制的幻觉很容易给人一种虚假的安全感,并且比根本不提供它更糟糕.

mercurial通过backout命令支持恢复已提交更改的常用方法(同样,mercurial书:处理已提交的更改)但信息不会从存储库中消失:因为您永远不知道谁正确克隆了您的存储库,这将导致错误如上所述,安全感.


是的,你可以:https://www.jitbit.com/alexblog/232-removing-files-from-mercurial-history/当然你们所有人都必须重新收回你的回购,但你们并没有放弃整个历史.

3> eswald..:

它可以在本地,但不是全局,并且在添加文件之后更改每个提交的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,将新提交转换为您应用于新提示的修补程序.

祝好运.



4> Tomislav Nak..:

它可以在10分钟内完成.在单个存储库中,虽然有后果.

方法:使用hg转换,如本优秀指南中所述.基本上,您将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都将不同

必须手动放置新的"干净"主存储库来代替现有存储库

所有团队成员都必须制作主要回购的新克隆

与Hg集成的任何其他服务可能需要注意(例如问题跟踪器,代码审查系统等)

推荐阅读
和谐啄木鸟
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有