Как клонировать подпапку репозитория в 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
Ответ 6
Это прямо с Преобразовать расширение.