Как клонировать подпапку репозитория в Mercurial?

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

Является ли клонирование только частью хранилища, и это правильный способ достичь этого?

Ответ 1

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

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

convert extension не включен по умолчанию, поэтому добавьте следующее в ваш файл repo 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, чтобы избавиться от каталога.

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

Ответ 2

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

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

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

$ echo include subfoo > /tmp/myfilemap
$ echo rename subfoo . >> /tmp/myfilemap
$ hg convert --filemap /tmp/myfilemap /path/to/repo/foo /tmp/mysubfoo-repo

Ответ 3

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

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

Ответ 4

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

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

Ответ 5

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

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

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

(2019) Расширение NarrowHG было объединено с Mercurial 4.6 как расширение hgext.narrow