Какова цель голых репозиториев git в .repo/projects/, созданных сценарием репо Android?

исходный код Android управляется репозиторий. При синхронизации с использованием репо создается каталог с именем .repo/projects/, который содержит все репозитории git, также извлеченные непосредственно в текущем рабочем каталоге, только в чистом формате git.

С какой целью в репозитории поддерживаются голые репозитории git? И как репо использует эти голые репозитории?

(Примечание: Уточнение: когда я пишу «репозиторий», я не говорю о репозитории git, я говорю конкретно о скрипте с именем repo, созданный/для Android для обслуживания всех репозиториев git, содержащих исходный код Android.)


person Bjarke Freund-Hansen    schedule 27.05.2011    source источник
comment
это не две копии, папка .git в компоненте содержит символические ссылки на соответствующий компонент в ./repo/projects   -  person Fredrik Pihl    schedule 27.05.2011
comment
@Fredrik Это ответ; опубликовать как таковой.   -  person Josh Lee    schedule 27.05.2011


Ответы (3)


Поработав какое-то время с системой манифеста репозитория Android, я думаю, что теперь понимаю назначение голых репозиториев в каталоге .repo/projects/.

Как уже ответил @Fredrik, в проектах нет другой копии репозиториев, представленных непосредственно в «клоне», созданном repo. На самом деле содержимое всех каталогов .git в клоне — это просто символические ссылки, например:

$ ll development/.git/
total 452
drwxr-xr-x  2 bfh bfh   4096 2011-08-15 13:55 ./
drwxr-xr-x 20 bfh bfh   4096 2011-08-15 13:55 ../
lrwxrwxrwx  1 bfh bfh     43 2011-08-15 13:55 config -> ../../.repo/projects/development.git/config
lrwxrwxrwx  1 bfh bfh     48 2011-08-15 13:55 description -> ../../.repo/projects/development.git/description
-rw-r--r--  1 bfh bfh     41 2011-08-15 13:55 HEAD
lrwxrwxrwx  1 bfh bfh     42 2011-08-15 13:55 hooks -> ../../.repo/projects/development.git/hooks/
-rw-r--r--  1 bfh bfh 449008 2011-08-15 13:55 index
lrwxrwxrwx  1 bfh bfh     41 2011-08-15 13:55 info -> ../../.repo/projects/development.git/info/
lrwxrwxrwx  1 bfh bfh     41 2011-08-15 13:55 logs -> ../../.repo/projects/development.git/logs/
lrwxrwxrwx  1 bfh bfh     44 2011-08-15 13:55 objects -> ../../.repo/projects/development.git/objects/
lrwxrwxrwx  1 bfh bfh     48 2011-08-15 13:55 packed-refs -> ../../.repo/projects/development.git/packed-refs
lrwxrwxrwx  1 bfh bfh     41 2011-08-15 13:55 refs -> ../../.repo/projects/development.git/refs/
lrwxrwxrwx  1 bfh bfh     45 2011-08-15 13:55 rr-cache -> ../../.repo/projects/development.git/rr-cache/
lrwxrwxrwx  1 bfh bfh     40 2011-08-15 13:55 svn -> ../../.repo/projects/development.git/svn

Таким образом, фактические репозитории git представлены только один раз в клоне.

Причина сохранения голого и обычного git заключается в том, как работает система манифеста. Система манифестов — это способ указать набор git, которые будут извлечены, и в какой версии они будут извлечены. Файл манифеста сам поддерживается в git, а команда репо позволяет изменять ветку этого манифеста git по своему усмотрению.

Таким образом, чтобы обеспечить (быстрый) способ удаления и добавления git в зависимости от того, что в данный момент выбрано в файле манифеста, репо может просто хранить все git, которые вы когда-либо клонировали, в папке .repo/projects, а затем копировать их только в «обычный» область клонирования, если они выбраны в текущей ветке файла манифеста.

person Bjarke Freund-Hansen    schedule 30.08.2011

Это не две копии, папка .git в компоненте содержит симлинки на соответствующий компонент в ./repo/projects

person Fredrik Pihl    schedule 27.05.2011

Отказ от ответственности: я далек от эксперта по Git.

Я думаю, вы говорите, что при оформлении заказа вы получаете две копии. Одна из них является рабочей копией (куда вы указали, что она должна быть скопирована), а другая хранится в .repo/projects. Предполагая, что я правильно интерпретировал вопрос, лучше всего предположить, что копия в .repo/projects сохраняется, чтобы вы могли быстро сравнивать и возвращаться к базовой версии, которую вы проверили, без необходимости возвращаться на сервер. Я думаю, что VCS довольно часто делают это. SVN делает это, помещая папку .svn во все папки вашей рабочей копии и помещая в них файлы базовой версии.

person Gyan aka Gary Buyn    schedule 27.05.2011
comment
Привет Гэри, спасибо за ваш ответ, но это не совсем то, о чем я спрашиваю. Я хорошо знаю git. Поскольку это распределенная система управления версиями, она должна локально клонировать все дерево версий, что приводит к тому, что для нормальной работы не требуются внешние подключения. Для этого git создает папку .git/ в каждом клонированном репозитории. Я не спрашиваю о папке .git, я спрашиваю о папке .repo, созданной пользовательским скриптом repo, созданным специально для Android, для управления довольно большой иерархией репозиториев git, содержащих исходный код Android. - person Bjarke Freund-Hansen; 27.05.2011