Подтвердить что ты не робот

Можно ли клонировать часть хранилища Mercurial?

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

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

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

4b9b3361

Ответ 1

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

@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=

Ответ 2

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

Цитата из UnderstandingMercurial:

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

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

Ответ 3

@Nick

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

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

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

Ответ 4

@Ник сказал:

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

Subrepos (aka subodules) не такие идеальные, как "узкие клоны", это правда. Но, по крайней мере, для того, чтобы иметь много разных проектов в одном репозитории хостинга, вы можете иметь несколько базовых кодов в одном хранилище. Это не позволит вам отрезать разные разделы одного репозитория/подкаталогов проекта, но это позволит вам управлять несколькими проектами. То, что вы делаете, имеет множество названных ветвей, каждое из которых связано с пустым (или нулевым) набором изменений (т.е. Они не имеют общей корневой редакции). Он может немного запутаться, чтобы отслеживать ветки, но он работает.

Например:

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

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

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