Ответ 1
Несколько репозиториев, леса и субрепосты - все варианты одной и той же идеи. Леса и SubRepos просто создают управляющие проекты, которые также используют более поздние версии других проектов, они не решают основной проблемы, которая у вас есть, то есть вы теряете историю файлов при перемещении между проектами.
На мой взгляд, лучше всего поставить все каталоги в один и тот же репозиторий и дождаться того, что функция Mercurial позволит проверять подкаталоги. Функция подкаталога - это то, о чем заботится команда Mercurial, но это не так уж и сложно, и поэтому это еще не сделано. Я знаю Mercurial внутренности, хотя, и это определенно выполнимо, просто много работы.
Второй лучший вариант, хотя я считаю его действительно уродливым, - это идея названных веток, о которой вы упомянули. У вас по-прежнему будет очень странная операция слияния, когда вы хотите копировать файлы между ветвями. Вы выполните следующие действия:
- Обновите головку ветки, в которую вы хотите скопировать файл:
hg update -C project1
- Слияние в ветке, которую вы хотите скопировать файл:
HGMERGE=/bin/false hg merge -r project2
- Вернитесь к ветке ветки, которую вы хотите скопировать файл:
hg revert -a --no-backup -r project1
- Отмените конкретный файл, который вы хотите скопировать, из главной версии объединенного в ветке:
hg revert --no-backup -r project2 path/to/file/in/project2.txt
- Переместите файл в это место в ветке, которую вы хотите скопировать, чтобы:
hg mv path/to/file/in/project2.txt project1/file/path/project2.txt
- Отметить слияние как разрешенное:
hg resolve -am
- И, наконец, зафиксируйте результат:
hg commit -m "A merge to copy project2.txt to project1."
Как я уже сказал, очень уродливо. И это может хорошо работать только в hg 1.3, так как я знаю, что некоторые важные ошибки во взаимодействии revert, merge и resolve были исправлены сравнительно недавно. (IMHO, я подозреваю, Ubuntu намеренно отстает от версий систем управления версиями без bzr.)
Как часто вы действительно хотите копировать файлы между проектами? Почему это произойдет? Вы уверены, что потерять историю будет так плохо?
Я сделал что-то подобное в Subversion для нескольких моих собственных проектов, но мой опыт в том, что мое первоначальное чувство о том, в каком проекте что-то действительно принадлежало, было обычно правильным, и когда он не сохранял историю, на самом деле эта большая сделка, так как история действительно была актуальна только для исходного проекта, файл был в любом случае.