如何在Mercurial中重命名目录并继续跟踪所有文件更改
我决定把我家里的Python项目中的一些文件夹改个名字(把doc
改成docs
,把test
改成tests
,把util
改成utils
),因为经过一番思考,我觉得新名字更合适。现在我的想法是,如果一个文件夹的名字是根据里面的内容来命名的,那这个名字应该用复数形式。
现在我准备好进行下一次hg commit
了,但我在想怎么告诉Mercurial这些文件夹名字的变化。我对版本控制软件还很陌生,才用Mercurial几个月。当我运行hg status
时,它显示这些文件夹里的所有文件都被标记为删除和添加,所以我担心如果我直接用hg addremove
,这些文件的变更历史会丢失,或者至少变更历史会变得支离破碎,难以追踪。我看到有hg rename
这个命令,但文档里只提到它是用来处理单个文件的,并没有说可以用在文件夹上。
在进一步阅读Bryan O'Sullivan的《权威指南》后,我发现也许rename
可以用在文件夹上。
所以我决定尝试以下方法:
hg rename --after doc docs
hg rename --after test tests
hg rename --after util utils
hg status
hg addremove
有没有人能告诉我,这种方法是否是Mercurial中重命名文件夹的认可和推荐方式,如果不是,我应该怎么做。
3 个回答
使用--after而不是用hg重命名的一个原因是,如果你正在使用一个重构工具,这个工具不仅仅是重命名,还能修复相关的引用。
Mercurial这个工具没有目录的概念,它把所有东西(文件和文件夹)都当作文件来看待。而且,我通常也不手动去重命名文件或文件夹,我都是用
hg rename old-name new-name
来完成的。我建议你也这样做。
Mercurial有一个重命名跟踪的功能,这意味着它可以追踪一个文件的完整历史,即使这个文件被重命名了。如果你手动去重命名,那就没办法追踪了。
不过,既然你已经手动重命名了文件,你需要在使用 hg log
时加上 --follow
参数,这样才能通过历史记录追踪文件的变化。
就我个人而言,我会选择用 hg rename
,这应该是更推荐的方法。
既然你已经重命名了文件夹,这样做是完全可以的。(如果你让Mercurial帮你重命名,就可以省去手动操作这一步:比如用 hg rename doc docs
这样的命令,而不是自己改完再告诉Mercurial。)
如果你没有其他文件需要提交,那么 hg addremove
这个命令就没必要了。你可以用 hg stat
命令查看输出,应该只会看到以 'R' 开头的行(对应 doc/*
、test/*
和 util/*
)和以 'A' 开头的行(对应 docs/*
等)。
最后,别忘了提交你的更改。
编辑:我忘了说……使用 hg log --follow
可以追踪重命名后的更改。