Длинный ответ:
Вы не можете указать имя ветви (или 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.
Почему они не используют 'git submodule' вместо .repo? Кажется, он был построен для этого ... –
'repo' может больше, чем просто синхронизация. Он автоматизирует загрузку в gerrit, создает филиалы, загружает изменения, не зная целевого git и т. Д. Конечно, это всего лишь сценарий оболочки, и буквально все может быть сделано с голым git. Но поскольку Google сделал «репо», все придерживаются этого: –