Other Languages: En

剪除无用分支

1. 关闭分发

Mercurial 从v1.2 开始支持分支的关闭.通过如下命令进行:

hg up -C badbranch
hg commit --close-branch -m '关闭死亡分支,不再啓用'
hg up -C default # 切换回"好"分支

通过创建一个无内容的修订集,在变更集的扩展属性中标记 close=1

一但分支被关闭,将在 hg branches 中显示已关闭. 关闭的分支将不在 --active 参数的分支列表中显示:

% hg branches
default                       12:d52ed2ac9127
badbranch                 11:cd3e11a024bf (closed)
% hg branches --active
default                       12:d52ed2ac9127

另外: hg heads (参考 Head)当前也接受 --active 参数来过滤已经标记为关闭的heads

2. No-Op 合并

而有种方法是通过进行 "no-op 合并" 来清除分支:

$ hg update -C tip      # 跳到对应 head
$ hg merge otherhead    # 和其它 head 合并
$ hg revert -a -r tip   # 反悔这一变更
$ hg commit -m "淘汰一个head" # 检入全新的顶部来替代老的

2.1. 为何这法儿可能杯具?

新的合并将基于这种"淘汰"头,但是,其实并不是真正替代了. 此外,其实已整合到主线,实际效果还不如直接放任那个无用的 head.

设想你对一个水银项目进行克隆 – 比如对 crew repository

而且你基于 修订P 进行了 C1 修订,并被全体成员包含到工程中.

那么修订C1 被拒绝或是 rebase 时,你的仓库中就存储了一个无用的分支 C1; 即使在你的仓库中合并 C1,实则创建了一个有别于其它成员的开发线. 那么在这情景中,合并自个儿的无用分支,不会象检入一个全新的修订来合并到主线那样引起其它成员的注意并接受到本地仓库, 即,对于项目成员,拉你的"己淘汰"头部,不能说是个"干净"的修订.

3. 动用克隆

推荐使用 hg clone --rev 来 "淘汰" 不想要的 head.

例如:

hg clone backup repo --rev X --rev Y

完成克隆后,进行检验:

hg incoming -R repo backup

应该只显示你不想要的变更集, 要是发现还有需要的(比如说,你忘记指出的变更集), 可以继续拉入:

hg pull -R repo backup --rev Y

重复以上,直到你满意.

复制还未跟踪的文件,特别是,你要复制.hg/ hgrc,因为你默认推送的仓库,指向的不是原先的克隆来源. 然后,才可以清除备份用的仓库.

4. 动用 strip

另外可以使用 hg strip 来剥离无用分支. 这是由 MqExtension 支持的功能:

hg strip [-f] [-b] [-n] REV

strip a revision and all later revs on the same branch

options:

 -b --backup    bundle unrelated changesets
 -n --nobackup  no backups

但是,请注意,这是一个版本库的 非-历史性-保持. 如果别人已经下拉了你的 C1 修订并作为父变更. 你可能会来从那人的仓库下拉时,回到解放前... (这就是"魔鬼瓶"问题,参考EditingHistory)


CategoryTipsAndTricks

ChinesePruningDeadBranches (last edited 2011-05-25 02:39:19 by ZoomQuiet)