2012-05-30 2 views
4

Im здание системы Cyanogenmod 9 (Android ICS) для телефона Nexus S (samsung crespo). Проблема заключается в том, что если я делаю:repo init конкретное совершение

repo init -u git://github.com/CyanogenMod/android.git -b ics 

РЭПО inits до последней фиксации МСС, в которой проявляется не включает некоторые устройства/Samsung/проектов, мне нужно (в частности https://github.com/CyanogenMod/android_device_samsung_crespo).

Как мне выполнить репо init для конкретной фиксации? В моем случае я хочу, чтобы последняя фиксация использовалась в ветке google android-4.0.3_r1. Это одна:

Если я

репо INIT -u мерзавец: //github.com/CyanogenMod/android.git -b совершить хэш-

Не работает, кажется, что repo init -b поддерживает только головку ветви.

Спасибо заранее.

ответ

5

Длинный ответ:

Вы не можете указать имя ветви (или SHA, или что-то еще), чтобы repo, он не будет работать. Вот почему:

repo - это скрипт, который обрабатывает коллекцию проектов репозитория (которые на самом деле являются независимыми git's). Список проектов находится в .repo git и содержит файл манифеста, который в основном представляет собой список всех репозитариев git и их ветвей. -b относится только к repo git во время repo init.

Вот пример .repo/manifests/default.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<manifest> 
    <remote fetch="git://address.com/" name="origin" 
      review="review.address.com"/> 
    <default remote="origin" revision="ics-something" sync-j="4"/> 
    <manifest-server url="http://manifests.address.com:8000"/> 
    <!-- sniff --> 
    <project name="platform/external/libxml2" path="external/libxml2" 
      revision="ics-common"/> 
    <project name="platform/external/zlib" path="external/zlib" 
      revision="ics-common"/> 
    <project name="platform/frameworks/base" path="frameworks/base" 
      revision="ics-something"/> 
    <project name="platform/packages/apps/Bluetooth" path="packages/apps/Bluetooth" 
      revision="ics-common"/> 
    <!-- sniff --> 
</manifest> 

Таким образом, правильный способ получения источников в хранилище для конкретной сборки является получение его манифеста.
I.e., manifest, который будет содержать SHA (или теги, которые практически одинаковы, если они присутствуют) вместо названий ветвей. Таким образом, каждый мерзавец проект в репозитории будет указывать на некоторые фиксации, что был последней максимален, когда сборка была выполнена:

<?xml version="1.0" encoding="UTF-8"?> 
<manifest> 
    <remote fetch="git://address.com/" name="origin" 
      review="review.address.com"/> 
    <default remote="origin" revision="ics-something" sync-j="4"/> 
    <manifest-server url="http://manifests.address.com:8000"/> 
    <!-- sniff --> 
    <project name="platform/external/libxml2" path="external/libxml2" 
      revision="refs/tags/android-4.0.4_r1.1"/> 
    <project name="platform/external/zlib" path="external/zlib" 
      revision="refs/tags/android-4.0.4_r1.1"/> 
    <project name="platform/frameworks/base" path="frameworks/base" 
      revision="ecb41a77411358d385e3fde5b4e98a5f3d9cfdd5"/> 
    <project name="platform/packages/apps/Bluetooth" path="packages/apps/Bluetooth" 
      revision="621bae79f1a250e443eb83d1f473c533bea493dc"/> 
    <!-- sniff --> 
</manifest> 

Как вы видите, единственное различие между этими двумя манифестами это значение ревизии репозитория Git и ,

Короткий ответ:

Вы должны получить manifest_static.xml конкретного билда.

Или, если вы просто не хватает какой-то проект, мерзавец, то вы можете создать local_manifest.xml файл в .repo мерзавца, добавить недостающие мерзавец там, а затем repo sync от корня вашего хранилища. Дополнительная информация о local_manifest.xml используется here.

+0

Почему они не используют 'git submodule' вместо .repo? Кажется, он был построен для этого ... –

+1

'repo' может больше, чем просто синхронизация. Он автоматизирует загрузку в gerrit, создает филиалы, загружает изменения, не зная целевого git и т. Д. Конечно, это всего лишь сценарий оболочки, и буквально все может быть сделано с голым git. Но поскольку Google сделал «репо», все придерживаются этого: –

3

Я понял. Если у вас есть тег в файле манифеста (например, version.xml). Вы можете репо инициализации для конкретного тега с помощью следующей команды:

repo init -u <addres> -b refs/tags/<tagname> -m version.xml 
1

не имеет достаточных полномочий, чтобы оставить свой комментарий, но я просто хотел уточнить ответ Андрейса Cainikovs в.

Repo принимает идентификатор фиксации SHA в дополнение к ответвлению ref в качестве аргумента опции -b.

Как следует из ответов, этот аргумент указывает на пересмотр манифеста, который должен использоваться репо, а не ревизию в любом из проектов, к которым относится манифест.

Смежные вопросы