Исходный код Android и РЕПО - что именно происходит при получении кода
я столкнулся с большим количеством коротких вопросов о минимальных аспектах использования repo
чтобы получить источник Android или очень широкие определения того, что repo
делает и в результате действительно не понимает, что происходит, когда я использую repo
. Я следую инструкциям на исходный сайт Android. Я делаю это все время в моем repodir
поэтому все упоминания о файлах относятся к этому.
инициализации и синхронизации РЕПО:
repo init -u https://android.googlesource.com/platform/manifest
repo sync
после того, как это завершится, мой папка полна папок типа android (bionic
, bootable
, etc etc) и скрытый . Примечательно, что есть папка под названием ics-mr1
, который относится к определенной версии и содержит в основном те же папки в мой repodir
внутри себя.
потяните вниз определенную ветку:
repo init -u https://android.googlesource.com/platform/manifest -b gingerbread
repo sync
это завершается относительно быстро, и основное изменение, которое я вижу, теперь есть папка с именем gingerbread
(все исходные папки, похоже, остаются).
теперь я попробуйте это, и это займет века:
repo init -u https://android.googlesource.com/platform/manifest -b android_4.2.2_r1
repo sync
после, он по-прежнему содержит то же самое gingerbread
и ics-mr1
и несколько новых случайных папок (например,abi
) но ничего, что кажется, что новая версия.
вопрос
как я могу получить локальную версию всего master
филиал источник, а потом правильно переключаться между ветвями, как я считаю нужным? То, как я сейчас, кажется неправильным, поскольку файлы, оставшиеся после изменений ветвей, кажутся нелогичными.
далее, Есть ли эффективный способ иметь локальные копии многочисленных ветвей одновременно, чтобы я мог сравнивать компоненты каждого (очевидно, без повторной загрузки их каждый раз)?
я задаю эти вопросы с большими дырами в понимании (те, которые я не смог найти ясно последовательная информация для), поэтому любая дополнительная информация об ответе, чтобы помочь понять, что на самом деле делается, действительно будет иметь ценность.
1 ответов
repo init
поскольку вы кажетесь довольно смекалистым, вы знаете, что РЕПО - это просто скрипт python, верно? Вы можете прочитать его, чтобы увидеть, как именно это работает. Я не прочитал все это, но, в основном, это обертывание git
и обеспечивает поддержку работы с несколькими репозиториями git. Идея в том, что есть файл манифеста, который определяет требования для разных версий Android. Когда вы делаете repo init
С аргументом он смотрит, какие репозитории git ему нужно клонировать и какие репозитории git вы уже синхронизировали, и какие ветви он должен получить, как только он получил соответствующие репозитории. Затем он обрабатывает все репозитории, которыми он управляет, в соответствующих ветвях. Подумайте о РЕПО как о добавлении другого слоя в стандартный рабочий процесс git (который, я предполагаю, вам знаком).
в первый раз, когда вы используете репо, чтобы получить главную ветку, вам нужно использовать
repo init -u https://android.googlesource.com/platform/manifest
и после этого вам нужно синхронизировать все файлы с сервера:
repo sync
это обновит текущий рабочий каталог до точного состояния, указанного в основной версии загруженного манифеста. Чтобы проверить другую версию AOSP, вы используете:
repo init -b version_name
это обновляет манифест до того, который содержит информацию о версии Android, которую вы хотите (также называемой веткой).
не забудьте синхронизировать.
для переключения на другую ветку манифеста,
repo init -b otherbranch
может используется в существующем клиенте. Однако, поскольку это только обновляет манифест, последующийrepo sync
(илиrepo sync -d
) нужно обновите файлы рабочего каталога.
поведение, которое вы испытываете, может показаться странным, потому что вы, вероятно, не привыкли работать с системой, которая так легко перезаписывает ваше локальное состояние. При использовании git вы не должны init
несколько раз в том же каталоге. Другой вариант-сделать новые каталоги для каждого проекта. Цель .каталог РЕПО должен хранить всю информацию, относящуюся к вашей текущей настройке РЕПО (также как .git directory). На самом деле, работает repo init
делает много вещей:
- загружает манифест с указанного url-адреса.
- пытается открыть или создать .каталог РЕПО.
- убедитесь, что ваш ключ GPG настроен.
- клоны указанная ветвь (по умолчанию REPO_REV если он не задан).
- проверяет его.
- проверяет соответствующую ветку для каждого из проектов.
я бы предположил, что операция клонирования записывает информацию в . Причина, по которой требуется время после выполнения первой команды:
repo init -u https://android.googlesource.com/platform/manifest
repo sync
это потому, что он должен загрузить много гигабайт информации. Теперь, уходя от master
филиала к gingerbread
РЕПО знает, что ему просто нужно упасть около 68 коммиты, которые можно сделать очень быстро.
$ repo init -u https://android.googlesource.com/platform/manifest -b gingerbread
$ repo sync
...
.repo/manifests/: discarding 68 commits
...
Ramping назад до android_4.2.2_r1
означает, что РЕПО должен загрузить любую информацию, необходимую для этих коммитов, а также обновить текущие ветви по всем ссылочным проектам. Это займет много времени; РЕПО-это использование торгового диска для обработки времени.
в самом деле?
теперь это представляет проблему: что, если вы хотите сравнить две ветви РЕПО сразу? Это трудно, потому что, когда вы repo init && repo sync
вы потеряйте старую информацию, на которую вы смотрели. Ответ заключается в том, чтобы скопировать соответствующую информацию, а затем repo init && repo sync
снова. Это будет раздражать очень быстро - к счастью, repo предоставляет способ ускорить этот процесс, если у вас есть дисковое пространство.
одна стратегия, чтобы сделать вещи быстрее, чтобы создать локальное зеркало в