Могу ли я клонировать часть хранилища Mercurial? - PullRequest
44 голосов
/ 17 ноября 2009

Возможно ли клонировать часть репозитория Mercurial? Допустим, хранилище достаточно большое, или содержит несколько проектов или несколько веток. Могу ли я клонировать только часть хранилища?

например. в Subversion у вас могут быть trunk и branches. Если я только хочу получить транк (или одну из веток), я могу просто запросить [project]/trunk. Если я клонирую репозиторий HG, я получу ствол и все ветви. Это может быть много информации, которую я не хочу. Могу ли я избежать этого?

В качестве альтернативы, если я хочу иметь несколько проектов в одном репозитории hg, как мне это сделать? То есть чтобы я мог просто взять один из проектов и игнорировать другие.

Ответы [ 7 ]

37 голосов
/ 14 февраля 2011

Да, вы можете. Я уверен, что вы пошли дальше, но ради тех, кто будет бродить здесь позже, я следовал за документами на ConvertExtension и написал простой пакетный скрипт:

@echo off
echo Converting %1
REM Create the file map
echo include %1 > ~myfilemap               
echo rename %1 . >> ~myfilemap 
REM Run the convert process
hg convert --filemap ~myfilemap .\ ..\%1   
REM Delete the file map
del ~myfilemap                             
cd ..\%1
REM update the new repo--to create the files
hg update                                  

Назовите его как split.cmd и поместите в каталог для репозитория, который вы хотите разделить. Например, у вас есть C:\repos\ReallyBigProject, а подпапка - C:\repos\ReallyBigProject\small-project. В командной строке выполните:

cd\repos\ReallyBigProject
split.cmd small-project

Это создаст C:\repos\small-project с фрагментом соответствующей истории изменений из более крупного проекта.

convert не включен по умолчанию. Вам нужно убедиться, что в вашем файле .hg\hgrc есть следующие строки (c:\repos\ReallyBigProject\.hg\hgrc в моем примере):

[extensions]
hgext.convert=
17 голосов
/ 17 ноября 2009

Насколько мне известно, это невозможно. Но по сравнению с Subversrion клонирование всего репозитория не может быть медленнее, чем просто ветка из SVN.

Цитирование из Понимание Mercurial :

Многие пользователи SVN / CVS ожидают принять связанные проекты вместе в одном репозиторий. Это действительно не то, что HG был сделан для, так что вы должны попробовать другой способ работы. это особенно значит, что ты не можешь проверить только один каталог репозиторий.

Если вам абсолютно необходим хост несколько проектов в своего рода мета-репозиторий, хотя, вы можете попробовать функция Subrepositories , которая была введены с Mercurial 1.3 или старше ForestExtension .

16 голосов
/ 18 ноября 2009

@ Ник

"Например, в Subversion у вас могут быть ствол и ветви. Если я только хочу получить транк (или одну из веток), я могу просто запросить [проект] / транк. Если я клонирую репозиторий hg, я получу транк и все ветви. Это может быть много информации, которую я не хочу. Могу ли я избежать этого? "

Абсолютно. Просто используйте hg clone -r <branch> и получите только нужную вам ветку. Если у вас много веток, вам нужно -r <branch> для каждого. <branch> не обязательно должна быть именованной веткой: вы можете просто иметь несколько неназванных головок (или именованных головок, используя закладки, хотя они все еще не идеальны, потому что в настоящее время они не отображаются с push / pull / clone) .

Имейте в виду, что в системах DVCS, среди которых Mercurial, ветви часто недолговечны и часто сливаются друг с другом. Если вы потянете ветку, вы все равно получите общую историю, которую она имеет с любыми другими ветками.

6 голосов
/ 18 ноября 2009

@ Ник сказал:

"Это довольно большое упущение, поскольку многие хостинговые сайты предлагают только один репо. С svn я могу эффективно иметь столько репо, сколько захочу, только взяв одну ветку из основного. Подпункты звучат как хак".

Подпункты (или подмодули) не так идеальны, как «узкие клоны», это правда. Но, по крайней мере, для того, чтобы в репозитории одного хостинг-сайта было много разных проектов, в одном репозитории может быть несколько кодовых баз. Это не позволит вам разделять различные разделы одного репозитория / подкаталогов проекта, но позволит вам управлять несколькими проектами. То, что вы делаете, - это множество именованных ветвей, каждая из которых укоренена в пустом (или нулевом) наборе изменений (т. Е. У них нет общей корневой ревизии). Может быть немного грязно, чтобы отслеживать ветви, но это работает.

Например:

hg init
hg branch project-1
# Changes, commits, repeated as needed
hg update null
hg branch project-2
# Changes, commits, repeated as needed

Теперь вы можете видеть все свои проекты:

> hg branches
project-2                      5:42c2beffe780
project-1                      2:43fd60024328

Проекты не связаны (хотя вы можете объединить их):

> hg debugancestors
-1:000000000000 

Наиболее полезно: вы можете клонировать только тот проект, который вам нужен, а остальные не будут смешиваться:

> hg clone <repository> -r project-1

График для этого будет выглядеть примерно так (hg log -qG):

@  5 | project-2 | {tip}
|
o  4 | project-2
|
o  3 | project-2

o  2 | project-1
|
o  1 | project-1
|
o  0 | project-1

Вы можете сделать это для любого количества проектов, перечислив каждый из них с помощью hg branches и прыгнув между ними с помощью hg update. Это требует некоторой заботы, потому что поддержка именованных веток не идеальна. С одной стороны, это не всегда интуитивно понятно (читайте о hg clone -u в Mercurial 1.4 - поведение до версии 1.4 удивительно при клонировании). Но это работает .

5 голосов
/ 17 ноября 2009

Mercurial и Git разрешают клонировать только весь репозиторий. Поэтому рекомендуется, чтобы каждый проект имел свой собственный репозиторий.

Mercurial имеет расширение forest для упрощения использования "леса" для репозиториев проектов. Расширение хранит каждый проект в отдельном репозитории, но предоставляет опции для обновления / отправки / извлечения всех лесных репозиториев вместе.

2 голосов
/ 22 февраля 2017

Много лет спустя ... Можно попросить Mercurial клонировать только ветку, используя hg clone -r branchname (см. Клон Mercurial из ветви ). С расширением Google NarrowHG можно выполнять узкое клонирование (см. Как клонировать подпапку хранилища в Mercurial? для аналогичного вопроса).

0 голосов
/ 22 февраля 2019

Я знаю, что прошло почти 10 лет после того, как был задан этот вопрос, я наткнулся этот вопрос случайно.

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

...