TL;DR 版本:是否可以在不破坏 Kiln/Fogbuz 历史的情况下重组 Mercurial 存储库?还是我必须重新开始?
我有一个非常混乱的存储库,需要进行一些认真的清理,并且正在尝试找出最好的方法。目标是完全删除一些文件——它们不应该出现在任何提交中,永远——移动一些目录,并将一个目录拆分到一个完全独立的存储库中。我知道,我知道——你不应该能够改变历史。但是,在这种情况下,它要么更改历史记录,要么从头开始使用新的存储库。
有问题的存储库在 Mercurial 中管理,远程存储库托管在Kiln中。在Fogbugz中跟踪问题。由于一些提交链接处理规则,提交消息中对问题(案例)编号的任何引用Case 123
都将转换为指向相关 Fogbugz 案例的链接。反过来,提到的案例有一个附有提交消息的注释。
当前结构
项目文件结构目前是这样的:
- /
+- includes/
| +- functions-related-to-abc.php
| +- functions-related-to-xyz.php
| +- class-something.php
| +- classes-several-things.php
| +- random-file.php
| ...
|
+- development/
| +- a-plugin-folder/
| | +- some-file.php
| | +- file-with-sensitive-and-non-sensitive-info.php
| | ...
| |
| +- some-backend-functions-related-to-coding.php
| ...
|
+- index.php
+- test-config-file.php
...
目标结构
我想要的结构是这样的:
- /
+- build/
+- doc/
+- src/
| +- functions/
| | +- abc.php // renamed from includes/functions-related-to-abc.php
| | +- xyz.php // renamed from includes/functions-related-to-xyz.php
| | ...
| |
| +- classes/
| | +- something.php // renamed from includes/class-something.php
| | +- several-things.php // renamed from includes/classes-several-things.php
| | ...
| |
| +- view/
| | +- random-file.php // formerly includes/random-file.php
| ...
|
| +- development/
| | +- some-backend-functions-related-to-coding.php
| | ...
| +- index.php
| ...
|
+- test/
...
a-plugin-folder
将移至其自己的单独存储库。test-config-file.php
将不再在存储库中进行跟踪。理想情况下,我还会对分支进行一些小的修剪和重命名。
在我的梦想世界中,file-with-sensitive-and-non-sensitive-info.php
会以某种方式始终如一地被跟踪,但是敏感信息(几个密码)被拉到一个不受版本控制的配置文件中。我意识到这可能是一厢情愿的想法。
我目前的想法
我目前的想法是,我的愿望清单基本上是不可能的:从现在开始,我可以创建新的、结构合理的存储库,但不能保留我的更改历史记录,也无法进行我需要进行的根本性结构更改。在这个视图中,我应该使用当前的代码库,按照我想要的方式重新组织它,并将它作为变更集 1 提交给两个新的存储库(根存储库和插件存储库)。然后,我会在某处备份旧存储库的副本以供参考。主要缺点:(1) 我丢失了所有历史记录,(2) Kiln 和 Fogbugz 对历史提交的交叉引用都是吐司。
我的问题
所以,问题来了:有什么方法可以做我想做的事——重组,拉出一些文件,让一切看起来很漂亮——而不丢失我所有的历史?
我考虑过使用hg convert
扩展名,大量使用filemap
,splicemap
和branchmap
选项。我用这种方法看到的问题包括:(1) 破坏所有先前的构建,(2) 根本没有file-with-sensitive-and-non-sensitive-info.php
先前的构建(或将其留在里面,这会破坏这一点),以及 (3) 大量渲染许多提交消息在他们引用文件名或 repo 结构的程度上是不正确的。换句话说,与刚开始干净、结构合理的存储库相比,我不确定这个选项对我有多大帮助。
我还考虑过极端的选择:编写某种自定义脚本来构建一个新的存储库,方法是遍历每个现有的提交,从 中剥离敏感信息,file-with-sensitive-and-non-sensitive-info.php
在必要的范围内重写提交消息,并提交所有内容的修订版本。从理论上讲,这可以解决我所有的问题,但代价是重新发明轮子并且可能要花费大量时间。我正在寻找不等同于编写整个hg
扩展的东西。
编辑:我正在考虑创建一个空的存储库,然后编写一个脚本,一次使用hg export
并hg import
带来一个变更集,在必要时进行编辑以从文件中去除密码等敏感信息。有没有理由这不起作用?