【发布时间】:2014-03-24 12:10:45
【问题描述】:
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 对历史提交的交叉引用都是吐司。
我的问题
那么,问题来了:有什么方法可以做我想做的事——重组、提取一些文件,让一切看起来很漂亮——而不会丢失我的所有历史记录?
我考虑过使用the hg convert extension,大量使用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 一次将变更集引入一个,在必要时进行编辑以去除敏感信息就像文件中的密码一样。这有什么不可行的原因吗?
【问题讨论】:
标签: mercurial repository fogbugz kiln mercurial-convert