How to rename a directory in Mercurial and continue to track all file changes

Question:

I decided to rename some directories in my home/hobby Python package (doc to docs, test to tests, util to utils) because, now that I’ve thought more about it, I think the new names are more appropriate. My general thinking now is that if containers are named after their contents their names should be plural nouns.

Now that I’m ready for my next hg commit I’m wondering how to tell Mercurial about these directory name changes. I am new to RCS software in general and have only been using Mercurial for a couple months. When I run hg status it shows all the the files in these directories being removed and added, so I’m afraid if I just do a hg addremove I will loose all the change history for the files in these directories, or at the very least the change history will become fragmented and untraceable. I’ve come across the hg rename command, but the docs only discuss its use for individual files, not directories.

After further reading in Bryan O’Sullivan’s ‘Definitive Guide’ it appears that maybe rename can refer to directories.

So here’s what I’ve decided to try:

hg rename --after doc docs
hg rename --after test tests
hg rename --after util utils
hg status
hg addremove

Can anyone tell me if this is the accepted and preferred method for renaming directories in Mercurial, and if not, how should I do it.

Asked By: Don O'Donnell

||

Answers:

Since you’ve already renamed the directories, this is perfectly OK. (It would have saved you a manual step if you’d let Mercurial rename them for you: hg rename doc docs, etc. instead of doing it yourself then letting Mercurial know about it).

If you don’t have any other files to check in, the hg addremove is superfluous. Look in the output of hg stat and you should only see lines beginning with ‘R’ (for doc/*, test/* and util/*) and ‘A’ (for docs/*, etc.)

Finally, don’t forget to commit the changes.

EDIT: Forgot to say… use hg log --follow to track changes across the rename.

Answered By: Niall C.

Mercurial has no concept of directories; it treats everything (files and directories) as files. Also, I usually never rename files or directories manually; I just use

hg rename old-name new-name

I suggest you do that too.

Mercurial offers a rename-tracking feature, which means that mercurial can trace the complete history of a file which has been renamed. If you manually rename this, its not possible.

However, as you have already renamed them manually, you need to use the --follow argument along with hg log to track the file changes through the history.

Personally I’d just go with hg rename and it should be the preferred method.

Answered By: user277465

One reason to use –after instead of renaming with hg is if you are using a refactoring tool that does more than just rename e.g. also fixes references.

Answered By: Andrew McKinlay
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.