简体   繁体   中英

How to properly use hg share extension?

Say I have cloned a repo to a directory called ~/trunk and I want to share a branch named my-new-branch to the directory ~/my-new-branch. How would I do that with the hg share extension?

This is what I've been doing:

cd ~

hg share trunk my-new-branch

But then when I cd into the new directory I have to hg up to the branch?

Confused.

IMO share is a very useful command which has some great advantages over clone in some cases. But I think it is unfortunately overlooked in many instances.

What share does is to re-use the 'store' of Mercurial version control information between more than one local repository. (It has nothing directly to do with branching.)

The 'store' is a bunch of files which represents all the history Mercurial saves for you. You don't interact with it directly. Its a black box 99.99% of the time.

share differs from the more commonly-used clone command in that clone would copy the information store, taking longer to run and using potentially a lot more disk space.

The "side effect" of using share rather than clone is that you will instantly see all the same commits in every shared repository. It is as if push/pull were to happen automatically among all the shared repos. This would not be true with clone , you'd have to explicitly push/pull first. This is quite useful but something to be mindful of in your workflow because it may surprise you the first time you use it if you are only used to clone .


If you want to work in multiple branches (named or unnamed) of your project simultaneously, either clone or share will work fine. One you have created the second repository, yes you need to update it to whatever changeset you want to begin working on.

Concrete example using share :

hg clone path\to\source\repo working1   # Create local repo working1 cloned from somewhere
cd working1
hg up branchname1  

cd ..

hg share working1 working2  # shares the 'store' already used for working1 with working2
cd working2
hg up branchname2  # some other branch or point to start working from

As soon as you commit something in working1 that commit will be visible in the history of working2 . But since they are not on the same branch this has no real immediate effect on working2 .

working2 will retain path\\to\\source\\repo as its default push/pull location, just like working1 .


My own practice has been to create numerous locally shared repositories (quick, easy, saves space) and work in various branches. Often I'll even have a few of them on the same named branch but set to different points in history, for various reasons. I no longer find much need to actually clone locally (on the same PC).


A caveat -- I would avoid using share across a network connection - like to a repo on a mapped network drive. I think that could suffer some performance or even reliability issues. In fact, I wouldn't work off a network drive with a Mercurial repo (if avoidable) in any circumstance. Cloning locally would be safer.

Secondly -- I would read the docs , there are a few weird scenarios you might encounter; but I think these are not likely just based on my own experience.


Final note: although share is implemented as an "extension" to Mercurial, it has been effectively a part of it since forever. So there is nothing new or experimental about it, don't let the "extension" deal put you off.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM