Как клонировать подпапку хранилища в Mercurial? - PullRequest
61 голосов
/ 28 мая 2009

У меня есть репозиторий Mercurial, содержащий несколько связанных проектов. Я хочу использовать только один из этих проектов для работы над ним в другом месте.

Возможно ли клонирование только части хранилища, и это правильный путь для достижения этого?

Ответы [ 6 ]

53 голосов
/ 28 мая 2009

Вам нужен узкий или частичный клон , но это, к сожалению, пока не поддерживается.

Если у вас уже есть большой репозиторий и вы понимаете, что имеет смысл разделить его на несколько меньших репозиториев, то вы можете использовать расширение convert , чтобы сделать преобразование Mercurial в Mercurial . Обратите внимание, что при этом создается новый репозиторий foo, и вы не можете нажимать / тянуть между your-big-repo и foo.

convert extension не включен по умолчанию, поэтому добавьте следующее в файл hgrc вашего репо или mercurial.ini:

[extensions]
hgext.convert=

Затем создайте файл map.txt с

include "libs/foo"
rename "libs/foo" .

(обратите внимание, что вы можете использовать косую черту даже в Windows) и запустить

$ hg convert --filemap map.txt your-big-repo foo

Это сделает foo хранилищем с полной историей папки libs/foo из your-big-repo.

Если вы хотите удалить все свидетельства foo из your-big-repo, вы можете сделать другое преобразование, в котором вы используете exclude libs/foo, чтобы избавиться от каталога.

Если у вас есть несколько таких репозиториев, и вы хотите использовать их как единое целое, тогда вам следует взглянуть на субпозитории . Эта функция позволяет вам включать в репозиторий другие репозитории - подобно тому, как работает svn:externals. Пожалуйста, следуйте рекомендациям на этой вики-странице.

11 голосов
/ 06 июня 2009

Вместо частичного клонирования вы можете использовать Преобразовать расширение , чтобы разделить ваше репо на несколько репо по подпозиторию.

В частности, см. Раздел, Преобразование из Mercurial :

Также полезно фильтровать репозитории Mercurial для получения подмножеств существующего. Например, чтобы преобразовать подкаталог subfoo из репозитория foo в репозиторий со своей собственной жизнью (при сохранении полной истории), выполните следующие действия:

$ echo include subfoo > /tmp/myfilemap
$ echo rename subfoo . >> /tmp/myfilemap
$ hg convert --filemap /tmp/myfilemap /path/to/repo/foo /tmp/mysubfoo-repo
6 голосов
/ 31 января 2011

Я наткнулся на эту проблему и нашел один способ сделать это: Использование символических ссылок (только для Linux, к сожалению)

Например, если вам нужно только /project в репозитории, на вашем компьютере клонируйте репо в другую папку, затем используйте ln -s /repo/location/ project. Mercurial справится с этим

3 голосов
/ 28 мая 2009

Это невозможно, hg clone клонирует весь репозиторий.

Вы можете посмотреть расширение под-репозитория, которое позволяет вам иметь репозитории внутри репозитория, которые могут соответствовать вашим потребностям.

2 голосов
/ 01 ноября 2016

(конец 2016 г.) Mainline Mercurial до сих пор не поддерживает пакет для "узких клонов", но существуют сторонние расширения, которые по-разному решают проблему.

Если вы можете справиться только с узкой проверкой (также известной как "редкая проверка" или "частичная проверка по пути к файлу"), тогда расширение sparse.py в Facebook из hg-экспериментального репозитория (загляните в каталог hgext3rd/) может быть работоспособным. В этом сценарии вы все еще клонируете полную историю (таким образом, каталог .hg не меньше), но ваш рабочий каталог показывает / действует только для подмножества полного хранилища.

В качестве альтернативы Google создал расширение NarrowHG , которое сужает клонирование (он же "частичное клонирование по пути к файлу"). Вам нужно будет управлять сервером, клиентом и быть готовыми использовать экспериментальные функции, но это действительно ограничивает скопированную историю клона в .hg подмножеством того, что было в исходном хранилище.

2 голосов
/ 30 апреля 2010

Это прямо с расширением Convert .

...