Перенос ветки репо на локальное зеркало 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 не будут использовать ревизию по умолчанию, а вместо этого переопределят ее своим собственным атрибутом ревизии. Это прекрасно, но потребует внесения дополнительных изменений в манифест.