Можно ли сделать частичный клон/ветвь с базаром, ртутным или git?
Предположим, что у меня есть проект в исходном управлении с большим количеством подкаталогов, многие из которых мне не нужны в данный момент.
Я хотел бы создать рабочую копию, содержащую только часть всего дерева, которая все еще сохраняет возможность вносить изменения, фиксировать их и нажимать на них.
Возможно ли это, и если да, как я могу это сделать?
Я все еще решаю, идти ли с базаром или меркуриальным, поэтому ответы на любой из этих вопросов были бы полезными.
Изменить: Собственно, решения для git также будут полезны.
Ответы
Ответ 1
Если у вас уже есть репозиторий, и вы хотите сделать это, это будет боль.
Если вы собираетесь делать это с совершенно новыми репозиториями, вы можете посмотреть на Mercurial new subrepos.
В основном вы создаете автономные репозитории для определенных каталогов:
myproject/
.hg/
source code/
... files here ...
documentation/ (subrepo)
.hg/
... files here ...
graphics/ (subrepo)
.hg/
... files here ...
Это изолирует разные части проекта в разных хранилищах. "Содержащее" репо (myproject в этом случае) отслеживает, какая ревизия подчиняется при каждом выполнении. Подредакторная страница subrepo, о которой я говорил, хорошо объясняет.
Ответ 2
Клонирование подмножества дерева невозможно, насколько я знаю, но есть и другие возможности.
Git: команда git clone
имеет флаг --depth
:
--depth <depth>
Создайте мелкий клон с историей, усеченной до указанного количества ревизий. Неглубокий репозиторий имеет ряд ограничений (вы не можете клонировать или извлекать из него, а также не нажимать и не на него), но он адекватен, если вас интересует только недавняя история крупного проекта с длинной историей, и он захочет отправьте исправления в виде патчей.
Bazaar: флаг --lightweight
для команды checkout
загружает только рабочий каталог вместо всей истории и сохраняет полосу пропускания и дисковое пространство. Все операции по-прежнему поддерживаются, но для их выполнения требуется сетевое подключение.
Я не знаю, имеет ли эта функция Merurial или нет.
Ответ 3
Судя по этой вики, эта функция еще не реализована в Mercurial, однако есть extension, который может сделать примерно то, что вы хотите, "преобразовывая" репозиторий или его часть, а не фактическое ветвление. Поскольку он может конвертировать из и в Hg, он может работать как частичное клонирование. Это то, что вам нужно?
Ответ 4
В git вы можете использовать git поддерево, которое позволяет извлекать "виртуальный" репозиторий только для определенного подпроекта, затем внесите изменения в подпроект, а затем снова объедините эти изменения.
Ответ 5
В большинстве DCVS это правило "1 проект == 1 репозиторий". Нет понятия "подпроект" (в отличие от Subversion, где вы можете проверить поддерево и работать над этим).
Основная причина заключается в том, что ваш "проект" содержит копию всего репозитория в корневой папке. Все будет довольно сложно, если вы сможете создавать копии всего репозитория в подпапках.
С положительной стороны создание рабочих копий - это быстрая операция (если базовая файловая система не работает).
Ответ 6
Для Bazaar у вас есть вложенные деревья: http://bazaar-vcs.org/NestedTreesDesign, который позволяет разделить большой проект в подпроектах.
Я еще не использовал эту функцию, поэтому не знаю, как хорошо она работает.
Вы также можете использовать ветку с помощью --hardlink, чтобы не копировать кучу файлов (не уверен, работает ли она на Windows...), ветвь без истории (более светлая ветка) или ветка без рабочего дерева (без файлов, только с историей).