Частичный клон с Git и Mercurial - PullRequest
73 голосов
/ 06 апреля 2010

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

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

Ответы [ 6 ]

75 голосов
/ 06 апреля 2010

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

  • неглубокие клоны: Я хочу историю с точки пересмотра 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), чтобы предварительно разбить репо на отдельные клонируемые части.

49 голосов
/ 06 апреля 2010

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

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

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

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

9 голосов
/ 06 февраля 2016

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

Сведите к минимуму объем загрузки и проверки (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 голосов
/ 29 февраля 2012

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

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

cd projecttemp

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

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

2 голосов
/ 04 января 2014

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

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

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

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

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

0 голосов
/ 21 февраля 2012

В Mercurial вы должны быть в состоянии сделать это, используя:

hg convert --banchmap FILE SOURCEDEST REVMAP

Вы также можете захотеть:

--config convert.hg.startrev=REV

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...