Перенос ветки репо на локальное зеркало AOSP

Я пытаюсь создать новую ветку AOSP (на моей машине для разработки) и отправить ее в локальное зеркало (на сервере в той же локальной сети). Я не могу найти документацию по инструменту "репо", которая объясняет, как это сделать.

Я создал зеркало источника AOSP на моем сервере, используя:

$ mkdir -p ~/aosp/mirror
$ cd ~/aosp/mirror
$ repo init -u https://android.googlesource.com/mirror/manifest --mirror

Затем я синхронизируюсь на другом компьютере:

 $ repo init -u <USERNAME>@<IP_OF_SERVER>:/home/<USERNAME>/aosp/mirror/platform/manifest.git -b android-4.2.2_1
 $ repo sync

Все идет нормально. Я использую "-b android-4.2.2_1", потому что мне нужна моя разработка, чтобы использовать эту версию JellyBean в качестве базовой линии.

Затем я создаю новую ветку, используя "начало репо":

$ repo start my-branch-name --all

Все еще хорош. Проблема в том, что я не могу понять, как "протолкнуть" эту ветку на удаленный сервер.

Когда я делаю repo info Я вижу:

Manifest branch: refs/tags/android-4.2.2_r1
Manifest merge branch: android-4.2.2_r1
Manifest groups: all,-notdefault
----------------------------
Project: platform/abi/cpp
Mount path: /home/<username>/<project_name>/android/abi/cpp
Current revision: refs/tags/android-4.2.2_r1
Local Branches: 1 [my-branch-name]
---------------------------
....

Когда я пытаюсь repo upload Я получил:

no branches ready for upload

Я тогда попробовал repo forall -c "git push aosp my-branch-name" который проталкивает локальные ветки в каждый удаленный репозиторий, но кажется, что это неправильный способ сделать это. В частности, если я попытаюсь создать нового клиента и попытаться выполнить синхронизацию с веткой, это не сработает.

$ repo init -u <USERNAME>@<IP_OF_SERVER>:/home/<USERNAME>/aosp/mirror/platform/manifest.git -b my-branch-name
error: revision my-branch-name in manifests not found

Как правильно создать "Манифестную ветку"?

1 ответ

Решение

repo start Команда создает локальную ветвь на основе текущей восходящей ветки. Бег repo upload будет загружать любые локальные коммиты в текущую извлеченную ветвь для проверки в ветку upstream, размещенную на сервере Gerrit, указанном в файле манифеста. Если тип push, который вы хотите сделать, не соответствует этому варианту использования, вы должны будете использовать базовые команды Git для push. Вы все еще можете использовать repo start хотя (но вы не должны).

Чтобы создать ветвь манифеста, repo start а также repo upload не полезны В отличие от других gits, которыми управляет Repo, вы должны внести все изменения в манифестный git на default филиал, который Repo проверяет для вас. Затем используйте простые команды Git, чтобы отправить ваши изменения.

В следующем примере показано, как создать новую ветвь манифеста с именем mybranch, идентичный текущему восходящему.

cd .repo/manifests
git push origin default:refs/heads/mybranch

Теперь это само по себе не очень полезно, так как содержимое вашего манифеста идентично ветке upstream - мы только что клонировали эту ветвь манифеста, так что пока вы можете запустить

repo init -u ssh://git.example.com/platform/manifest -b mybranch

результаты будут идентичны тому, с чего вы начали:

repo init -u ssh://git.example.com/platform/manifest -b android-4.2.2_1

Чтобы ваше зеркало было полезным, вы также должны разветвить каждый git, указанный в манифесте, чтобы получить ветку на вашем сервере, где вы можете вносить изменения.

Теоретически вы можете вносить изменения в те же ветки, которые вы скачали с вашего апстрима, но это может создать беспорядок, когда вы попытаетесь синхронизироваться с апстримом в следующий раз. Не делай этого.

Для создания веток на сервере вы можете использовать тот же шаблон, что и для манифеста:

cd build
git push ssh://git.example.com/platform/build HEAD:refs/heads/mybranch

Обратите внимание на использование HEAD, символического имени текущего извлеченного коммита. Делать это для каждого мерзавца утомительно, поэтому используйте repo forall команда:

repo forall -c 'git push aosp HEAD:refs/heads/mybranch'

Обратите внимание, что удаленное имя отличается от манифеста git (IIRC).

Увидеть repo help forall для списка переменных среды, доступных для команд, запускаемых repo forall (REPO_PROJECT, $REPO_LREV, а также $REPO_RREV наверное, самые полезные).

Это легко испортить repo forallтак что сделайте хорошей привычкой добавлять в команду команду echo во-первых, чтобы команды, которые были бы запущены, отображались на вашем терминале. Если вы довольны результатами, удалите echo запускать команды по-настоящему.

К настоящему времени у вас будет mybranch Разветвите все ваши гиты, включая манифест. Осталось изменить манифест так, чтобы

repo init -u ssh://git.example.com/platform/manifest -b mybranch

будет на самом деле проверить mybranch во всех мерзавцах.

cd .repo/manifests
vi default.xml
[ Change the default revision from refs/tags/android-4.2.2_1
  or whatever it says to 'mybranch'. ]
git commit -a -m 'Changed default revision to mybranch.'
git push origin default:refs/heads/mybranch

Обратите внимание, что все gits не обязательно используют ревизию по умолчанию (которую вы только что изменили на mybranch). Вероятно, это относится к ветке манифеста android-4.2.2_1, но в других случаях некоторые gits не будут использовать ревизию по умолчанию, а вместо этого переопределят ее своим собственным атрибутом ревизии. Это прекрасно, но потребует внесения дополнительных изменений в манифест.

Другие вопросы по тегам