Вопрос по github, git, repository, cyanogenmod, android – репо инициировать конкретный коммит

4

Я создаю систему CyanogenMod 9 (Android ICS) для телефона Nexus S (Samsung Crespo). Проблема в том, что если я сделаю:

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

Репозиторий относится к последнему коммиту ICS, в котором манифест не включает некоторые устройства / Samsung / проекты, которые мне нужны (в частности,https://github.com/CyanogenMod/android_device_samsung_crespo).

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

https://github.com/CyanogenMod/android/commit/5f5da775f570f2995c8ff2db98e6c8b40852911c

Если я сделаю

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

Не работает, похоже, что repo init -b поддерживает только HEAD ветви.

Заранее спасибо.

Ваш Ответ

3   ответа
1

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

Repodoes accept a commit-id SHA в дополнение к ветке ref в качестве аргумента опции -b.

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

4

version.xml). Вы можете повторить init для определенного тега с помощью следующей команды:

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

Long answer:

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

repo это скрипт, который обрабатывает коллекцию проектов репозитория (которые на самом деле являются независимыми файлами). Список проектов находится в.repo git и содержит файл манифеста, который в основном представляет собой список всех репозиториев git и их ветвей.-b актуально только дляrepo мерзость во время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>

So, the correct way of obtaining the sources of the repository for the particular build is to obtain it's manifest.
То есть, манифест, который будет содержать SHA (или теги, которые практически одинаковы, если они присутствуют) вместо имен ветвей. Таким образом, каждый git-проект в вашем репозитории будет указывать на определенный коммит, который был последним наибольшим при выполнении сборки:

<?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.

Short answer:

Вам необходимо получитьmanifest_static.xml конкретной сборки.

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

Почему они не используютgit submodule вместо .репо? Кажется, это было построено для этого ...
repo может больше, чем просто синхронизация. Он автоматизирует загрузку в gerrit, создает ветки, загружает изменения, не зная целевой git и т. Д. Конечно, это всего лишь скрипт-обертка, и буквально все можно сделать с помощью чистого git. Но так как Google сделалrepoвсе к этому привязаны :)

Похожие вопросы