Making mercurial subrepositories behave like subversion externals

Posted by Emily Dickinson on Stack Overflow See other posts from Stack Overflow or by Emily Dickinson
Published on 2010-04-03T05:05:23Z Indexed on 2010/04/03 5:13 UTC
Read the original article Hit count: 737

Filed under:

Hi guys,

The FAQ, and hginit.com have been really useful for helping me make the transition from svn to hg.

However, when it comes to using Hg's subrepository feature in the manner of subversion's externals, I've tried everythign and cannot replicate the nice behavior of svn externals.

Here's the simplest example of what I want to do:

  1. Init "lib" repository This repository is never to be used as a standalone; it's always included by main repositories, as a sub-repository.

  2. Init one or more including repositories To keep the example simple, I'll "init" a repository called "main"

  3. Have "main" include "lib" as a subrepository

  4. Importantly -- AND HERE'S WHAT I CAN'T GET TO WORK: When I modify a file inside of "main/lib", and I push the modification, then that change gets pushed to the "lib" repository -- NOT to a copy inside of "main".

Command lines speak louder than words. I've tried so many variations on this theme, but here's the gist. If someone can reply, in command lines, I'll be forever grateful!

1. Init "lib" repository

$ cd /home/moi/hgrepos ## Where I'm storing my hg repositories, on my main server

$ hg init lib

$ echo "foo" > lib/lib.txt

$ hg add lib

$ hg ci -A -m "Init lib" lib

2. Init "main" repository, and include "lib" as a subrepos

$ cd /home/moi/hgrepos

$ hg init main

$ echo "foo" > main/main.txt

$ hg add main

$ cd main

$ hg clone ../lib lib

$ echo "lib=lib" > .hgsub

$ hg ci -A -m "Init main" .

This all works fine, but when I make a clone of the "main" repository, and make local modifications to files in "main/lib", and push them, the changes get pushed to "main/lib", NOT to "lib".

IN COMMAND-LINE-ESE, THIS IS THE PROBLEM:

$ /home/moi/hg-test

$ hg clone ssh://[email protected]/hgrepos/lib lib

$ hg clone ssh://[email protected]/hgrepos/main main

$ cd main

$ echo foo >> lib/lib.txt

$ hg st

M lib.txt

$ hg com -m "Modified lib.txt, from inside the main repos" lib.txt

$ hg push

pushing to ssh://[email protected]/hgrepos/main/lib

That last line of output from hg shows the problem.

It shows that I've made a modification to a COPY of a file in lib, NOT to a file in the lib repository. If this were working as I'd like it to work, the push would be to hgrepos/lib, NOT to hgrepos/main/lib. I.e., I would see:

$ hg push

pushing to ssh://[email protected]/hgrepos/lib

IF YOU CAN ANSWER THIS IN TERMS

OF COMMAND LINES RATHER THAN IN ENGLISH,

I WILL BE ETERNALLY GRATEFUL!

Thank you in advance!

Emily in Portland

© Stack Overflow or respective owner

Related posts about mercurial