8

我正在尝试创建 AOSP 的新分支(在我的开发机器上)并将其推送到本地镜像(在同一 LAN 上的服务器上)。我找不到解释如何执行此操作的“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

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

4

1 回答 1

12

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

创建一个清单分支,repo startrepo upload没有用。与 Repo 管理的其他 git 不同,您应该对defaultRepo 为您签出的分支上的清单 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 help forall运行的命令的环境变量列表,请参阅参考资料。repo forallREPO_PROJECT$REPO_LREV$REPO_RREV

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

到目前为止,您mybranch的所有 git 中都会有一个分支,包括清单。剩下的就是改变清单,以便

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

实际上会检查mybranch所有的git。

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

请注意,所有 git 不一定使用默认修订版(您刚刚更改为mybranch)。android-4.2.2_1 清单分支可能就是这种情况,但在其他情况下,一些 git 不会使用默认修订版,而是使用自己的修订版属性覆盖它。这很好,但它需要您进行额外的清单更改。

于 2013-11-04T04:34:37.627 回答