Частичный клон с Git и Mercurial

Можно ли клонировать только одну ветвь (или из заданного фиксации) в Git и Mercurial? Я имею в виду, я хочу клонировать центральное репо, но, поскольку он огромный, я хотел бы только получить его часть и по-прежнему вносить свой вклад в мои изменения. Является ли это возможным? Например, я хочу только от Tag 130 или что-то в этом роде?

Если да, то как?

Ответ 1

В области Git вы говорите о трех разных типах частичных клонов:

  • неглубокие клоны: Я хочу, чтобы история из точки пересмотра X продолжалась.

    Используйте git clone --depth <n> <url>, но помните, что мелкие клоны несколько ограничены во взаимодействии с другими репозиториями. Вы сможете создавать патчи и отправлять их по электронной почте.

  • частичный клон по пути к файлу: Я хочу, чтобы вся история истории изменений в некотором каталоге /path.

    Невозможно в Git. С современным Git, хотя у вас может быть редкая проверка, т.е. У вас есть целая история, но вы проверяете (имеете в рабочей области) только подмножество всех файлов.

  • клонирование только выбранной ветки: Я хочу клонировать только одну ветвь (или выбранное подмножество ветвей).

    Возможно, и

    до Git 1.7.10 не просто: вам нужно будет сделать то, что делает клон, т.е. git init [<directory>], затем git remote add origin <url>, отредактировать .git/config замену * в remote.origin.fetch на запрошенную ветку (возможно 'master'), затем git fetch.

    от Git 1.7.10 git clone предлагает --single-branch, который кажется, что он был добавлен именно для этой цели, и кажется довольно простым.

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

Вы также можете сделать неглубокий клон только выбранного подмножества ветвей.

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

Ответ 2

В ртутной земле вы говорите о трех разных типах частичных клонов:

  • неглубокие клоны: я хочу, чтобы история из точки пересмотра X вперед использовала расширение удаленного файла
  • частичные клоны по пути к файлу: я хочу, чтобы вся история изменений в каталоге/пути была экспериментальной узкое расширение или я хотите, чтобы файлы в каталоге/пути находились в моем рабочем каталоге с экспериментальным разреженным расширением (поставляется с версии 4.3, см. hg help sparse).
  • частичные клоны по ветки: я хочу, чтобы вся история изменений на ветке Y: использовать clone -r

Если вы знаете, как люди захотят сломать вещи по пути к файлу (несколько проектов в одном и том же репо (позор вам)), вы можете использовать субрепозитории (вроде как svn externals) для предварительного разделения репо на отдельные клонируемые части

Кроме того, что касается "настолько огромного, что я бы хотел только получить его часть": вам действительно нужно сделать это только один раз. Просто клонируйте его, пока вы пообедаете, а потом у вас его еще больше. Впоследствии вы можете pull и эффективно дельта эффективно продвигаться вперед. И если вам нужен еще один клон, просто клонируйте свой первый клон. Там, где вы получили клон, не имеет значения (и локальные клоны не занимают дополнительного дискового пространства, так как они жесткие ссылки под обложками).

Ответ 3

Этот метод создает неверсированный архив без подпозиций:

hg clone -U ssh://machine//directory/path/to/repo/project projecttemp

cd projecttemp

hg archive -r tip ../project-no-subrepos

Неверсифицированный исходный код без подпоследовательности находится в каталоге project-no-subrepos

Ответ 4

Выбранный ответ дает хороший обзор, но отсутствует полный пример.

Минимизировать загрузку и контроль (a), (b):

git clone --no-checkout --depth 1 --single-branch --branch (name) (repo) (folder)
cd (folder)
git config core.sparseCheckout true
echo "target/path/1" >>.git/info/sparse-checkout
echo "target/path/2" >>.git/info/sparse-checkout
git checkout

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

git clean --dry-run # consider and tweak results then switch to --force
git gc
git repack -Ad
git prune

См. также: Как обрабатывать большие репозитории с помощью git

Ответ 5

Что касается Git, это может иметь историческое значение, которое Линус Торвальдс ответил на этот вопрос с концептуальной перспективы еще в 2007 году в разговоре, который был записан и доступен в Интернете.

Вопрос в том, можно ли проверить только некоторые файлы из репозитория Git.

Tech Talk: Линус Торвальдс на Git t = 43: 10

Подводя итог, он сказал, что одно из дизайнерских решений Git, которое отличает его от других систем управления версиями (он цитирует BitKeeper и SVN), заключается в том, что Git управляет содержимым, а не файлами. Последствия, заключающиеся в том, что, например, diff подмножества файлов в двух версиях вычисляется, сначала беря весь diff, а затем обрезая его только в файлы, которые были запрошены. Другое дело, что вам нужно проверить всю историю; во всех или ничего. По этой причине он предлагает разделить слабо связанные компоненты между несколькими репозиториями и упомянуть о продолжающейся попытке реализовать пользовательский интерфейс для управления репозиторием, который структурирован как суперпроект с меньшими репозиториями.

Насколько я знаю, это фундаментальное дизайнерское решение все еще яблоки сегодня. Суперпроектная вещь, вероятно, стала тем, что теперь submodules.

Ответ 6

В mercurial вы должны уметь так использовать некоторые из них, используя:

hg convert --banchmap FILE SOURCEDEST REVMAP

Вы также можете:

--config convert.hg.startrev=REV

Источник может быть git, меркуриальным или множеством других систем.

Я не пробовал, но конвертер довольно богат.