Making mercurial subrepositories behave like subversion externals
- by Emily Dickinson
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:
Init "lib" repository
This repository is never to be used as a standalone; it's always included by main
repositories, as a sub-repository.
Init one or more including repositories
To keep the example simple, I'll "init" a repository called "main"
Have "main" include "lib" as a subrepository
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