Исходный код 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 делает много вещей:

  1. загружает манифест с указанного url-адреса.
  2. пытается открыть или создать .каталог РЕПО.
  3. убедитесь, что ваш ключ GPG настроен.
  4. клоны указанная ветвь (по умолчанию REPO_REV если он не задан).
  5. проверяет его.
  6. проверяет соответствующую ветку для каждого из проектов.

я бы предположил, что операция клонирования записывает информацию в . Причина, по которой требуется время после выполнения первой команды:

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 предоставляет способ ускорить этот процесс, если у вас есть дисковое пространство.

одна стратегия, чтобы сделать вещи быстрее, чтобы создать локальное зеркало в