我在正在开发的游戏中错误地组织了代码,并打算将状态更新代码从GameView
类移动到Level
类。我想以某种方式记录这种剪切和粘贴。我使用Mercurial进行版本控制。 Mercurial可以实现吗?是否有其他VCS提供此功能?
阅读更多内容并观看Linus关于谷歌git的讨论,以及回顾答案和评论,我理解这是git的blame
命令的一个功能,并通过启发式方法工作。
我可以使用hg-git,导出Mercurial变更集,然后只使用git blame -M -C
命令来获得此功能。有没有更简单的方法不涉及git?
如果不是,我会接受提及git的现有答案并描述最佳使用其功能。
答案 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跟踪数据的移动。可以使用git
和Clearcase
跟踪重命名。