使用Mercurial记录两个文件之间的代码转换

时间:2011-02-11 16:38:25

标签: version-control mercurial dvcs

我在正在开发的游戏中错误地组织了代码,并打算将状态更新代码从GameView类移动到Level类。我想以某种方式记录这种剪切和粘贴。我使用Mercurial进行版本控制。 Mercurial可以实现吗?是否有其他VCS提供此功能?


阅读更多内容并观看Linus关于谷歌git的讨论,以及回顾答案和评论,我理解这是git的blame命令的一个功能,并通过启发式方法工作。

我可以使用hg-git,导出Mercurial变更集,然后只使用git blame -M -C命令来获得此功能。有没有更简单的方法不涉及git?

如果不是,我会接受提及git的现有答案并描述最佳使用其功能。

5 个答案:

答案 0 :(得分:2)

git会自动执行此操作。见How does Git track history during a refactoring?

答案 1 :(得分:1)

如果级别类尚不存在,您可以使用:

hg copy GameView.ext Level.ext

然后从GameView中删除你移动到Level的任何内容,并修改Level以反映正确的名称并排除所有留在GameView中的内容。

如果Level已经存在,我认为没有任何好的方法可以做到这一点,除非你愿意将这些代码提取到自己的类中,该类可以作为GameView的副本开始并被包含在内(通过#include,级别中的组合或扩展。

答案 2 :(得分:1)

我不认为Mercurial会明确跟踪文件重命名/移动,至少它不是变更集的一部分(尽管它可以根据内容来猜测特定文件的来源)。

话虽这么说,我担心我不知道任何VCS跟踪文件之间的代码移动,只是添加到目标和从源减去。

答案 3 :(得分:1)

Mercurial支持文件重命名检测,如下所示:

hg addremove -s 100

-s表示“相似性”,100表示​​100%。它将查找名称已更改但内容保持不变的文件。

我经常使用这个命令,相似度为85或90%。结合允许干运行的-n开关(即只做报告),它可以非常强大。

实际移动代码的检测实际上是不可能的,我不这么认为。

答案 4 :(得分:0)

我为这种情况做的是将更改与我的其他开发隔离开,然后在一次提交中使用注释提交移动,“在文件之间移动函数munge()。

据我所知,没有VCS跟踪数据的移动。可以使用gitClearcase跟踪重命名。