7

Как я могу проверить только часть Git-репозитория? У меня есть хранилище с несколькими модулями, и я хочу, чтобы только один из модулей был установлен на определенном сайте.

В Subversion я бы сделал svn export http://example.com/repository/path/to/module ./module-name .

3 ответа3

3

Как упомянул @Chris, текущие версии Git поддерживают редкие проверки.

Чтобы преобразовать локальное хранилище, чтобы оно содержало только указанные каталоги:

cd <repo/location>
git config core.sparsecheckout true
echo desiredDir/ >> .git/info/sparse-checkout    # repeat to add multiple subdirs (the rest will be removed)

Теперь, чтобы удалить все, кроме указанных каталогов:

 git read-tree -mu HEAD             # remove all, but those in .git/info/sparse-checkout
2

Я думаю, что самым близким эквивалентом экспорта SVN будет архив Git. Вы можете извлечь path/to/module из главной ветви репозитория и вставить имя module-name в локальный каталог следующим образом:

git archive --remote=url-of-Git-repository --prefix=module-name/ master:path/to/module |
tar xf -

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


Тем не менее, ваше использование «check out» подразумевает (для меня), что вы хотите иметь функциональное дерево работы Git только с некоторыми присутствующими файлами. Это можно сделать с помощью функции «разреженного контроля», представленной в Git 1.7.0.

Включить эту функцию

  1. установив для параметра конфигурации core.sparseCheckout значение «true» *, и
  2. заполнение файла $GIT_DIR/info/sparse-checkout для репозитория шаблонами для имен путей, которые нужно сохранить **.

    Можно использовать низкоуровневый «бит пропуска рабочего дерева» в индексе *** для управления разреженностью отдельных файлов, но, вероятно, вместо этого проще использовать механизм более высокого уровня.

В общем пользовательском интерфейсе есть некоторые пробелы (т. Е. Нет простого способа сказать «клонировать репозиторий по этому URL-адресу, а только проверить X, Y и Z»), но этого должно быть достаточно, чтобы получить функциональность «частичной проверки».

* см. «core.sparseCheckout» на странице конфигурации git
** см. раздел «Редкая проверка» в справочной странице git read-tree
*** см. «Бит Skip-worktree» на странице руководства git update-index

1

https://stackoverflow.com/questions/600079/is-there-any-way-to-clone-a-git-repositorys-sub-directory-only

Нет, это невозможно в Git.

Внедрение чего-то подобного в Git было бы существенным усилием, и это означало бы, что целостность клиентского репозитория больше не может быть гарантирована. Если вам интересно, поищите обсуждения "sparse clone" и "sparse fetch" в списке рассылки git.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .