将存储库分支推送到本地 AOSP 镜像



我正在尝试创建AOSP的新分支(在我的开发机器上)并将其推送到本地镜像(在同一局域网上的服务器上)。 我找不到解释如何执行此操作的"repo"工具的文档。

我使用以下方法在服务器上创建了 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"创建一个新分支:

$ 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

创建"清单分支"的正确方法是什么?

repo start 命令基于当前上游分支创建本地分支。正在运行的 repo upload 会将当前签出分支上的任何本地提交上传到清单文件中列出的 Gerrit 服务器托管的上游分支以供查看。如果要执行的推送类型与此用例不匹配,则必须使用底层 Git 命令进行推送。不过,您仍然可以使用repo start(但您不必这样做)。

若要创建清单分支,repo startrepo upload没有用。与 Repo 管理的其他 git 不同,您应该在 Repo 为您签出的default分支上对清单 git 进行所有更改。然后,使用普通 Git 命令推送更改。

以下示例演示如何创建一个名为 mybranch 的新清单分支,与当前上游相同。

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

现在,这本身并不是很有用,因为清单的内容与上游分支相同 - 我们刚刚克隆了清单的该分支,因此您可以运行

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,这是当前签出提交的符号名称。为每个 git 执行此操作很乏味,因此请使用 repo forall 命令:

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

请注意,远程名称与清单 git (IIRC) 不同。

有关可用于repo forall运行的命令的环境变量列表,请参阅repo help forallREPO_PROJECT$REPO_LREV$REPO_RREV 可能是最有用的变量)。

很容易

搞砸 repo forall ,所以养成一个好习惯,先在命令前面加上echo,让本来应该运行的命令回显到你的终端。如果您对结果感到满意,请删除echo以实际运行命令。

到现在为止,您的所有 GIT 中都有一个 mybranch 分支,包括清单。剩下的就是更改清单,以便

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

实际上会在所有GIT中签出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 不会使用默认修订版,而是使用自己的修订版属性覆盖它。这完全没问题,但它需要您进行其他清单更改。

最新更新